You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by bb...@apache.org on 2022/08/05 21:35:39 UTC

[airflow] branch main updated: Use meta value url for dataset links (#25551)

This is an automated email from the ASF dual-hosted git repository.

bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 8070a781b6 Use meta value url for dataset links (#25551)
8070a781b6 is described below

commit 8070a781b6292ce0795ceed6f36217dd61023dad
Author: Brent Bovenzi <br...@gmail.com>
AuthorDate: Fri Aug 5 22:35:22 2022 +0100

    Use meta value url for dataset links (#25551)
    
    * use macro for modal
    
    * fix datasets url
    
    * fix datasets urls
---
 .../www/static/js/components/Table/Cells.test.tsx  | 94 ++++++++++++++++++++++
 airflow/www/static/js/components/Table/Cells.tsx   | 25 +++---
 airflow/www/static/js/datasets/Details.tsx         |  7 +-
 airflow/www/templates/airflow/datasets.html        |  1 +
 4 files changed, 116 insertions(+), 11 deletions(-)

diff --git a/airflow/www/static/js/components/Table/Cells.test.tsx b/airflow/www/static/js/components/Table/Cells.test.tsx
new file mode 100644
index 0000000000..e92722449c
--- /dev/null
+++ b/airflow/www/static/js/components/Table/Cells.test.tsx
@@ -0,0 +1,94 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* global describe, test, expect */
+
+import React from 'react';
+import '@testing-library/jest-dom';
+import { render } from '@testing-library/react';
+
+import { ChakraWrapper } from 'src/utils/testUtils';
+import * as utils from 'src/utils';
+import { TaskInstanceLink } from './Cells';
+
+const taskId = 'task_id';
+const sourceDagId = 'source_dag_id';
+const sourceRunId = 'source_run_id';
+const originalDagId = 'og_dag_id';
+
+describe('Test TaskInstanceLink', () => {
+  test('Replaces __DAG_ID__ url param correctly', async () => {
+    jest.spyOn(utils, 'getMetaValue').mockImplementation(
+      (meta) => {
+        if (meta === 'grid_url') return '/dags/__DAG_ID__/grid';
+        return null;
+      },
+    );
+
+    const { getByText } = render(
+      <TaskInstanceLink
+        cell={{
+          value: taskId,
+          row: {
+            original: {
+              sourceRunId,
+              sourceDagId,
+              sourceMapIndex: -1,
+            },
+          },
+        }}
+      />,
+      { wrapper: ChakraWrapper },
+    );
+
+    const link = getByText(`${sourceDagId}.${taskId}`);
+    expect(link).toBeInTheDocument();
+    expect(link).toHaveAttribute('href', `/dags/${sourceDagId}/grid?dag_run_id=${sourceRunId}&task_id=${taskId}`);
+  });
+
+  test('Replaces existing dag id url param correctly', async () => {
+    jest.spyOn(utils, 'getMetaValue').mockImplementation(
+      (meta) => {
+        if (meta === 'dag_id') return originalDagId;
+        if (meta === 'grid_url') return `/dags/${originalDagId}/grid`;
+        return null;
+      },
+    );
+
+    const { getByText } = render(
+      <TaskInstanceLink
+        cell={{
+          value: taskId,
+          row: {
+            original: {
+              sourceRunId,
+              sourceDagId,
+              sourceMapIndex: -1,
+            },
+          },
+        }}
+      />,
+      { wrapper: ChakraWrapper },
+    );
+
+    const link = getByText(`${sourceDagId}.${taskId}`);
+    expect(link).toBeInTheDocument();
+    expect(link).toHaveAttribute('href', `/dags/${sourceDagId}/grid?dag_run_id=${sourceRunId}&task_id=${taskId}`);
+  });
+});
diff --git a/airflow/www/static/js/components/Table/Cells.tsx b/airflow/www/static/js/components/Table/Cells.tsx
index 0c06d9f7dc..b111a8b6dd 100644
--- a/airflow/www/static/js/components/Table/Cells.tsx
+++ b/airflow/www/static/js/components/Table/Cells.tsx
@@ -23,6 +23,7 @@ import {
 } from '@chakra-ui/react';
 
 import Time from 'src/components/Time';
+import { getMetaValue } from 'src/utils';
 
 interface CellProps {
   cell: {
@@ -35,18 +36,24 @@ interface CellProps {
 
 export const TimeCell = ({ cell: { value } }: CellProps) => <Time dateTime={value} />;
 
-export const DatasetLink = ({ cell: { value, row } }: CellProps) => (
-  <Link
-    color="blue.600"
-    href={`/datasets?dataset_id=${row.original.datasetId}`}
-  >
-    {value}
-  </Link>
-);
+export const DatasetLink = ({ cell: { value, row } }: CellProps) => {
+  const datasetsUrl = getMetaValue('datasets_url');
+  return (
+    <Link
+      color="blue.600"
+      href={`${datasetsUrl}?dataset_id=${row.original.datasetId}`}
+    >
+      {value}
+    </Link>
+  );
+};
 
 export const TaskInstanceLink = ({ cell: { value, row } }: CellProps) => {
   const { sourceRunId, sourceDagId, sourceMapIndex } = row.original;
-  const url = `/dags/${sourceDagId}/grid?dag_run_id=${encodeURIComponent(sourceRunId)}&task_id=${encodeURIComponent(value)}`;
+  const gridUrl = getMetaValue('grid_url');
+  const dagId = getMetaValue('dag_id');
+  const stringToReplace = dagId || '__DAG_ID__';
+  const url = `${gridUrl?.replace(stringToReplace, sourceDagId)}?dag_run_id=${encodeURIComponent(sourceRunId)}&task_id=${encodeURIComponent(value)}`;
   const mapIndex = sourceMapIndex > -1 ? `[${sourceMapIndex}]` : '';
   return (
     <Box>
diff --git a/airflow/www/static/js/datasets/Details.tsx b/airflow/www/static/js/datasets/Details.tsx
index 753f1dc333..0a67744080 100644
--- a/airflow/www/static/js/datasets/Details.tsx
+++ b/airflow/www/static/js/datasets/Details.tsx
@@ -31,12 +31,15 @@ import {
 import { ClipboardButton } from 'src/components/Clipboard';
 import type { API } from 'src/types';
 import InfoTooltip from 'src/components/InfoTooltip';
+import { getMetaValue } from 'src/utils';
 
 interface Props {
   datasetId: string;
   onBack: () => void;
 }
 
+const gridUrl = getMetaValue('grid_url');
+
 const Details = ({
   dataset: {
     uri,
@@ -68,7 +71,7 @@ const Details = ({
         <Link
           key={`${dagId}.${taskId}`}
           color="blue.600"
-          href={`/dags/${dagId}/grid`}
+          href={dagId ? gridUrl?.replace('__DAG_ID__', dagId) : ''}
           display="block"
         >
           {`${dagId}.${taskId}`}
@@ -86,7 +89,7 @@ const Details = ({
         <Link
           key={dagId}
           color="blue.600"
-          href={`/dags/${dagId}/grid`}
+          href={dagId ? gridUrl?.replace('__DAG_ID__', dagId) : ''}
           display="block"
         >
           {dagId}
diff --git a/airflow/www/templates/airflow/datasets.html b/airflow/www/templates/airflow/datasets.html
index 1cd81d547d..5b613b28fa 100644
--- a/airflow/www/templates/airflow/datasets.html
+++ b/airflow/www/templates/airflow/datasets.html
@@ -24,6 +24,7 @@
   {{ super() }}
   <meta name="datasets_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dataset_endpoint_get_datasets') }}">
   <meta name="dataset_events_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dataset_endpoint_get_dataset_events') }}">
+  <meta name="grid_url" content="{{ url_for('Airflow.grid', dag_id='__DAG_ID__') }}">
 {% endblock %}
 
 {% block content %}