コード例 #1
0
    def testDagsImportWarning(self, source, exec_mock):
        """Tests successful DAG importing."""
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=self.MakeEnvironmentWithBucket())
        source = 'subdir/*.txt'

        self._SetUpGsutil()
        fake_exec = kubectl_util.FakeExec()
        exec_mock.side_effect = fake_exec
        fake_exec.AddCallback(
            0,
            self.MakeGsutilExecCallback([
                '-m', 'cp', '-r', source, self.test_gcs_bucket_path + '/dags/'
            ]))

        self.RunEnvironments('storage', 'dags', 'import', '--project',
                             self.TEST_PROJECT, '--location',
                             self.TEST_LOCATION, '--environment',
                             self.TEST_ENVIRONMENT_ID, '--source', source)

        fake_exec.Verify()
        self.AssertErrContains(
            'Use of gsutil wildcards is no longer supported in --source. '
            'Set the storage/use_gsutil property to get the old behavior '
            'back temporarily. However, this property will eventually be '
            'removed.')
コード例 #2
0
  def testPluginsDeleteTargetSpecified(self, use_gsutil, exec_mock):
    """Tests successful plugins deleting for a specific file."""
    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())

    subdir_ref = storage_util.ObjectReference(self.test_gcs_bucket, 'plugins/')
    self.ExpectObjectGet(subdir_ref)
    target = 'subdir/file.txt'

    if use_gsutil:
      self._SetUpGsutil()
      fake_exec = kubectl_util.FakeExec()
      exec_mock.side_effect = fake_exec
      fake_exec.AddCallback(
          0,
          self.MakeGsutilExecCallback(
              ['-m', 'rm', '-r',
               '{}/plugins/{}'.format(self.test_gcs_bucket_path, target)]))
    else:
      self._SetUpStorageApi()

    self.RunEnvironments('storage', 'plugins', 'delete',
                         '--project', self.TEST_PROJECT,
                         '--location', self.TEST_LOCATION,
                         '--environment', self.TEST_ENVIRONMENT_ID,
                         target)

    if use_gsutil:
      fake_exec.Verify()
    else:
      self.delete_mock.assert_called_once_with(
          storage_util.BucketReference(self.test_gcs_bucket), target, 'plugins')
コード例 #3
0
    def testDagsDeleteTargetNotSpecified(self, use_gsutil, exec_mock):
        """Tests successful deletion of the entire DAGs directory."""
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=self.MakeEnvironmentWithBucket())

        subdir_ref = storage_util.ObjectReference(self.test_gcs_bucket,
                                                  'dags/')
        self.ExpectObjectGet(subdir_ref)

        if use_gsutil:
            self._SetUpGsutil()
            fake_exec = kubectl_util.FakeExec()
            exec_mock.side_effect = fake_exec
            fake_exec.AddCallback(
                0,
                self.MakeGsutilExecCallback([
                    '-m', 'rm', '-r',
                    '{}/dags/*'.format(self.test_gcs_bucket_path)
                ]))
        else:
            self._SetUpStorageApi()

        self.RunEnvironments('storage', 'dags', 'delete', '--project',
                             self.TEST_PROJECT, '--location',
                             self.TEST_LOCATION, '--environment',
                             self.TEST_ENVIRONMENT_ID)

        if use_gsutil:
            fake_exec.Verify()
        else:
            self.delete_mock.assert_called_once_with(
                storage_util.BucketReference(self.test_gcs_bucket), '*',
                'dags')
コード例 #4
0
    def testDagsImport(self, use_gsutil, exec_mock):
        """Tests successful DAG importing."""
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=self.MakeEnvironmentWithBucket())
        source = 'subdir/file.txt'

        if use_gsutil:
            self._SetUpGsutil()
            fake_exec = kubectl_util.FakeExec()
            exec_mock.side_effect = fake_exec
            fake_exec.AddCallback(
                0,
                self.MakeGsutilExecCallback([
                    '-m', 'cp', '-r', source,
                    self.test_gcs_bucket_path + '/dags/'
                ]))
        else:
            self._SetUpStorageApi()

        self.RunEnvironments('storage', 'dags', 'import', '--project',
                             self.TEST_PROJECT, '--location',
                             self.TEST_LOCATION, '--environment',
                             self.TEST_ENVIRONMENT_ID, '--source', source)

        if use_gsutil:
            fake_exec.Verify()
        else:
            self.import_mock.assert_called_once_with(
                storage_util.BucketReference(self.test_gcs_bucket), source,
                'dags/')
コード例 #5
0
    def testPluginsExport(self, use_gsutil, isdir_mock, exec_mock):
        """Tests successful plugins exporting."""
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=self.MakeEnvironmentWithBucket())
        source = 'subdir/file.txt'
        destination = 'destdir'

        if use_gsutil:
            self._SetUpGsutil()
            fake_exec = kubectl_util.FakeExec()
            exec_mock.side_effect = fake_exec
            fake_exec.AddCallback(
                0,
                self.MakeGsutilExecCallback([
                    '-m', 'cp', '-r',
                    posixpath.join(self.test_gcs_bucket_path, 'plugins',
                                   source), destination
                ]))
        else:
            self._SetUpStorageApi()

        self.RunEnvironments('storage', 'plugins', 'export', '--project',
                             self.TEST_PROJECT, '--location',
                             self.TEST_LOCATION, '--environment',
                             self.TEST_ENVIRONMENT_ID, '--source', source,
                             '--destination', destination)

        if use_gsutil:
            fake_exec.Verify()
        else:
            self.export_mock.assert_called_once_with(
                storage_util.BucketReference(self.test_gcs_bucket),
                posixpath.join('plugins', source), destination)
コード例 #6
0
  def testDagsExportWarning(self, source, isdir_mock, exec_mock):
    """Tests that when no SOURCE is provided, the entire folder is exported."""
    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())
    destination = 'destdir'

    self._SetUpGsutil()
    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    fake_exec.AddCallback(
        0,
        self.MakeGsutilExecCallback(
            ['-m', 'cp', '-r',
             posixpath.join(self.test_gcs_bucket_path, 'dags', source),
             destination]))

    self.RunEnvironments('storage', 'dags', 'export',
                         '--project', self.TEST_PROJECT,
                         '--location', self.TEST_LOCATION,
                         '--environment', self.TEST_ENVIRONMENT_ID,
                         '--destination', destination,
                         '--source', source)

    fake_exec.Verify()
    self.AssertErrContains(
        'Use of gsutil wildcards is no longer supported in --source. '
        'Set the storage/use_gsutil property to get the old behavior '
        'back temporarily. However, this property will eventually be '
        'removed.')
コード例 #7
0
    def testRunFetchKubectlNamespaceFail(self, exec_mock, tmp_kubeconfig_mock):
        test_env_object = self.MakeEnvironmentWithStateAndClusterLocation(
            self.messages.Environment.StateValueValuesEnum.RUNNING)
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=test_env_object)
        fake_exec = kubectl_util.FakeExec()
        exec_mock.side_effect = fake_exec

        tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

        def _FailedFetchKubectlNamespaceCallback(*unused_args,
                                                 **unused_kwargs):
            return 1

        fake_exec.AddCallback(0, _FailedFetchKubectlNamespaceCallback)

        with self.AssertRaisesExceptionMatches(
                command_util.Error, 'kubectl returned non-zero status code'):
            self.RunEnvironments('run', '--project', self.TEST_PROJECT,
                                 '--location', self.TEST_LOCATION,
                                 self.TEST_ENVIRONMENT_ID,
                                 self.TEST_SUBCOMMAND)
        self.assertEqual(1, exec_mock.call_count)
        fake_exec.Verify()
コード例 #8
0
  def testDataDeleteRestoresSubdir(self, use_gsutil, exec_mock):
    """Tests that the data dir is restored if it's missing after deletion."""
    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())

    subdir_ref = storage_util.ObjectReference(self.test_gcs_bucket, 'data/')
    self.ExpectObjectGet(subdir_ref,
                         exception=http_error.MakeHttpError(code=404))
    self.ExpectObjectInsert(subdir_ref)

    if use_gsutil:
      self._SetUpGsutil()
      fake_exec = kubectl_util.FakeExec()
      exec_mock.side_effect = fake_exec
      fake_exec.AddCallback(
          0,
          self.MakeGsutilExecCallback(
              ['-m', 'rm', '-r', '{}/data/*'.format(
                  self.test_gcs_bucket_path)]))
    else:
      self._SetUpStorageApi()

    self.RunEnvironments('storage', 'data', 'delete',
                         '--project', self.TEST_PROJECT,
                         '--location', self.TEST_LOCATION,
                         '--environment', self.TEST_ENVIRONMENT_ID)

    if use_gsutil:
      fake_exec.Verify()
    else:
      self.delete_mock.assert_called_once_with(
          storage_util.BucketReference(self.test_gcs_bucket), '*', 'data')
コード例 #9
0
  def testDagsExportWildcardSource(self, use_gsutil, isdir_mock, exec_mock):
    """Tests that when no SOURCE is provided, the entire folder is exported."""
    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())
    destination = 'destdir'

    if use_gsutil:
      self._SetUpGsutil()
      fake_exec = kubectl_util.FakeExec()
      exec_mock.side_effect = fake_exec
      fake_exec.AddCallback(
          0,
          self.MakeGsutilExecCallback(
              ['-m', 'cp', '-r',
               posixpath.join(self.test_gcs_bucket_path, 'dags', '*'),
               destination]))
    else:
      self._SetUpStorageApi()

    self.RunEnvironments('storage', 'dags', 'export',
                         '--project', self.TEST_PROJECT,
                         '--location', self.TEST_LOCATION,
                         '--environment', self.TEST_ENVIRONMENT_ID,
                         '--destination', destination)

    if use_gsutil:
      fake_exec.Verify()
    else:
      self.export_mock.assert_called_once_with(
          storage_util.BucketReference(self.test_gcs_bucket),
          'dags/*', destination)
コード例 #10
0
  def testDeleteSuccessful(self, exec_mock):
    """Tests successful Delete call."""
    target = 'c/d'
    env_ref = parsers.ParseEnvironment(self.TEST_ENVIRONMENT_NAME)

    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec

    fake_exec.AddCallback(
        0,
        self.MakeGsutilExecCallback(
            ['-m', 'rm', '-r',
             '{}/subdir/{}'.format(self.test_gcs_bucket_path, target)]))

    self.ExpectObjectGet(
        gcs_util.ObjectReference(self.test_gcs_bucket, 'subdir/'))

    storage_util.Delete(env_ref, target, 'subdir', release_track=self.track)
    fake_exec.Verify()
コード例 #11
0
    def testRunWithArgs(self, exec_mock, tmp_kubeconfig_mock):
        test_env_object = self.MakeEnvironmentWithStateAndClusterLocation(
            self.messages.Environment.StateValueValuesEnum.RUNNING)
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=test_env_object)
        subcmd_args = ['--arg1', '--arg2', 'val2']

        fake_exec = kubectl_util.FakeExec()
        exec_mock.side_effect = fake_exec

        tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

        fake_exec.AddCallback(
            0, self.MakeFetchKubectlNamespaceCallback([('default', 'Active')]))
        fake_exec.AddCallback(
            1,
            self.MakeGetPodsCallback(
                [command_util.GkePodStatus(self.TEST_POD, 'running', 'true')]))
        fake_exec.AddCallback(
            2,
            self.MakeKubectlExecCallback(self.TEST_POD,
                                         subcmd_args=subcmd_args))

        self.RunEnvironments('run', '--project', self.TEST_PROJECT,
                             '--location', self.TEST_LOCATION,
                             self.TEST_ENVIRONMENT_ID, self.TEST_SUBCOMMAND,
                             '--', *subcmd_args)
        fake_exec.Verify()
コード例 #12
0
    def testRunMissingDesiredPod(self, exec_mock, tmp_kubeconfig_mock):
        test_env_object = self.MakeEnvironmentWithStateAndClusterLocation(
            self.messages.Environment.StateValueValuesEnum.RUNNING)
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=test_env_object)
        fake_exec = kubectl_util.FakeExec()
        exec_mock.side_effect = fake_exec

        tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

        fake_exec.AddCallback(
            0, self.MakeFetchKubectlNamespaceCallback([('default', 'Active')]))
        fake_exec.AddCallback(
            1,
            self.MakeGetPodsCallback([
                command_util.GkePodStatus('pod1', 'running', 'true'),
                command_util.GkePodStatus('pod2', 'running', 'true')
            ]))

        with self.AssertRaisesExceptionMatches(command_util.Error,
                                               'Desired GKE pod not found'):
            self.RunEnvironments('run', '--project', self.TEST_PROJECT,
                                 '--location', self.TEST_LOCATION,
                                 self.TEST_ENVIRONMENT_ID,
                                 self.TEST_SUBCOMMAND)
        fake_exec.Verify()
コード例 #13
0
  def testGetGkePod_KubectlError(self, exec_mock, tmp_kubeconfig_mock):
    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    # kubectl returns with nonzero exit code
    fake_exec.AddCallback(0, lambda *_, **__: 1)

    with self.AssertRaisesExceptionMatches(command_util.Error,
                                           'Error retrieving GKE pods'):
      command_util.GetGkePod('pod1', self.TEST_KUBECTL_DEFAULT_NAMESPACE)
    fake_exec.Verify()
コード例 #14
0
ファイル: util_test.py プロジェクト: bopopescu/gcloud_cli
  def testGetGkePod_PodNotFound(self, exec_mock, tmp_kubeconfig_mock):
    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    fake_exec.AddCallback(
        0, self.MakeGetPodsCallback([('pod1', 'running'), ('pod2', 'running')]))

    with self.AssertRaisesExceptionMatches(command_util.Error,
                                           'Desired GKE pod not found'):
      command_util.GetGkePod('pod3', self.TEST_KUBECTL_DEFAULT_NAMESPACE)
    fake_exec.Verify()
コード例 #15
0
  def testFetchKubectlNamespace(self, exec_mock, tmp_kubeconfig_mock):
    env_image_version = 'composer-1.2.3-airflow-4.5.6'

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    # NOTE: FetchKubectlNamespace() results are returned in asc order by
    #       creation timestamp.

    # Scenario // 2 active namespaces.
    fake_exec.AddCallback(
        0,
        self.MakeFetchKubectlNamespaceCallback(
            [('default', 'Active'),
             ('composer-1-2-3-airflow-4-5-6-aabbccdd', 'Active')]))

    # Scenario // 3 active namespaces.
    fake_exec.AddCallback(
        1,
        self.MakeFetchKubectlNamespaceCallback(
            [('default', 'Active'),
             ('composer-1-2-3-airflow-4-5-6-aabbccdd', 'Active'),
             ('composer-1-2-3-airflow-4-5-6-beeffeed', 'Active')]))

    # Scenario // 3 namespaces;
    # 2 active namespaces, but most recent namespace in 'Terminating' state.
    fake_exec.AddCallback(
        2,
        self.MakeFetchKubectlNamespaceCallback(
            [('default', 'Active'),
             ('composer-1-2-3-airflow-4-5-6-aabbccdd', 'Active'),
             ('composer-1-2-3-airflow-4-5-6-beeffeed', 'Terminating')]))

    # Scenario // 3 namespaces, but none match image-version prefix.
    fake_exec.AddCallback(
        3,
        self.MakeFetchKubectlNamespaceCallback([('foo', 'Active'),
                                                ('bar', 'Terminating'),
                                                ('baz', 'Active')]))

    self.assertEqual('composer-1-2-3-airflow-4-5-6-aabbccdd',
                     command_util.FetchKubectlNamespace(env_image_version))
    self.assertEqual('composer-1-2-3-airflow-4-5-6-beeffeed',
                     command_util.FetchKubectlNamespace(env_image_version))
    self.assertEqual('composer-1-2-3-airflow-4-5-6-aabbccdd',
                     command_util.FetchKubectlNamespace(env_image_version))
    self.assertEqual('default',
                     command_util.FetchKubectlNamespace(env_image_version))

    fake_exec.Verify()
コード例 #16
0
  def testGetGkePod_PodNoReady(self, exec_mock, tmp_kubeconfig_mock):
    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    fake_exec.AddCallback(
        0, self.MakeGetPodsCallback(
            [command_util.GkePodStatus('airflow-worker1', 'creating', 'true'),
             command_util.GkePodStatus('airflow-worker2', 'running', '')]))

    pod = command_util.GetGkePod('airflow-worker',
                                 self.TEST_KUBECTL_DEFAULT_NAMESPACE)
    self.assertEqual('airflow-worker2', pod)
    fake_exec.Verify()
コード例 #17
0
ファイル: util_test.py プロジェクト: bopopescu/gcloud_cli
  def testGetGkePod_Success(self, exec_mock, tmp_kubeconfig_mock):
    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    fake_exec.AddCallback(
        0,
        self.MakeGetPodsCallback([('airflow-worker12345', 'running'),
                                  ('airflow-scheduler00001', 'running')]))

    pod = command_util.GetGkePod('airflow-worker',
                                 self.TEST_KUBECTL_DEFAULT_NAMESPACE)
    self.assertEqual('airflow-worker12345', pod)
    fake_exec.Verify()
コード例 #18
0
  def testRunKubectlCommand_KubectlError(self, exec_mock,
                                         tmp_kubeconfig_mock):
    kubectl_args = ['exec', '-it', 'airflow-worker12345', 'bash']

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    # kubectl returns with nonzero exit code
    fake_exec.AddCallback(0, lambda *_, **__: 1)
    with self.AssertRaisesExceptionMatches(
        command_util.KubectlError, 'kubectl returned non-zero status code'):
      command_util.RunKubectlCommand(kubectl_args)
    fake_exec.Verify()
コード例 #19
0
  def testGetGkePod_PodNotRunning(self, exec_mock, tmp_kubeconfig_mock):
    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    fake_exec.AddCallback(
        0, self.MakeGetPodsCallback(
            [command_util.GkePodStatus('pod1', 'creating', 'false'),
             command_util.GkePodStatus('pod2', 'creating', 'false')]))

    with self.AssertRaisesExceptionMatches(command_util.Error,
                                           'No running GKE pods found.'):
      command_util.GetGkePod('pod1', self.TEST_KUBECTL_DEFAULT_NAMESPACE)
    fake_exec.Verify()
コード例 #20
0
  def testRunKubectlCommand_Success(self, exec_mock,
                                    tmp_kubeconfig_mock):
    kubectl_args = ['exec', '-it', 'airflow-worker12345', 'bash']
    expected_args = command_util.AddKubectlNamespace(
        self.TEST_KUBECTL_DEFAULT_NAMESPACE,
        [self.TEST_KUBECTL_PATH] + kubectl_args)

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

    fake_exec.AddCallback(
        0, lambda args, **_: self.assertEqual(expected_args, args))
    command_util.RunKubectlCommand(
        kubectl_args, namespace=self.TEST_KUBECTL_DEFAULT_NAMESPACE)
    fake_exec.Verify()
コード例 #21
0
  def _GsutilFailsHelper(self, callback, exec_mock):
    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec

    def _FailedGsutilCallback(unused_args, **unused_kwargs):
      return 1

    fake_exec.AddCallback(0, _FailedGsutilCallback)

    with self.AssertRaisesExceptionMatches(
        command_util.Error, 'gsutil returned non-zero status code.'):
      callback()

    fake_exec.Verify()
コード例 #22
0
    def testSubcommandRun_BackfillOlderAirflow_YesNotAdded(
            self, exec_mock, tmp_kubeconfig_mock):
        test_env_object = self.MakeEnvironmentWithStateAndClusterLocation(
            self.messages.Environment.StateValueValuesEnum.RUNNING,
            image_version='composer-1.2.3-airflow-1.10.3')
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=test_env_object)

        subcmd = 'backfill'
        subcmd_args = []

        fake_exec = kubectl_util.FakeExec()
        exec_mock.side_effect = fake_exec

        tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

        fake_exec.AddCallback(
            0, self.MakeFetchKubectlNamespaceCallback([('default', 'Active')]))
        fake_exec.AddCallback(
            1,
            self.MakeGetPodsCallback(
                [command_util.GkePodStatus(self.TEST_POD, 'running', 'true')]))

        # Ensure that the '--yes' argument has not been added to the list of
        # 'backfill' args.
        fake_exec.AddCallback(
            2,
            self.MakeKubectlExecCallback(self.TEST_POD,
                                         subcmd=subcmd,
                                         subcmd_args=subcmd_args))

        self.RunEnvironments('run', '--project', self.TEST_PROJECT,
                             '--location', self.TEST_LOCATION,
                             self.TEST_ENVIRONMENT_ID, subcmd, '--',
                             *subcmd_args)

        fake_exec.Verify()
コード例 #23
0
  def testExportSuccessful(self, isdir_mock, exec_mock):
    """Tests successful Export call."""
    source = 'c/d'
    env_ref = parsers.ParseEnvironment(self.TEST_ENVIRONMENT_NAME)

    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec

    fake_exec.AddCallback(
        0,
        self.MakeGsutilExecCallback(
            ['-m', 'cp', '-r']
            + [posixpath.join(self.test_gcs_bucket_path, source)]
            + ['subdir']))

    storage_util.Export(env_ref, source, 'subdir', release_track=self.track)
    fake_exec.Verify()
コード例 #24
0
    def testSubcommandRun_DeleteDag(self, exec_mock, tmp_kubeconfig_mock):
        test_env_object = self.MakeEnvironmentWithStateAndClusterLocation(
            self.messages.Environment.StateValueValuesEnum.RUNNING)
        self.ExpectEnvironmentGet(self.TEST_PROJECT,
                                  self.TEST_LOCATION,
                                  self.TEST_ENVIRONMENT_ID,
                                  response=test_env_object)

        subcmd = 'delete_dag'
        subcmd_args = []

        fake_exec = kubectl_util.FakeExec()
        exec_mock.side_effect = fake_exec

        tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig

        fake_exec.AddCallback(
            0, self.MakeFetchKubectlNamespaceCallback([('default', 'Active')]))
        fake_exec.AddCallback(
            1,
            self.MakeGetPodsCallback(
                [command_util.GkePodStatus(self.TEST_POD, 'running', 'true')]))

        # Ensure that the '--yes' argument is added to the list of 'delete_dag' args
        # if it is not present.
        fake_exec.AddCallback(
            2,
            self.MakeKubectlExecCallback(self.TEST_POD,
                                         subcmd=subcmd,
                                         subcmd_args=subcmd_args + ['--yes']))

        self.RunEnvironments('run', '--project', self.TEST_PROJECT,
                             '--location', self.TEST_LOCATION,
                             self.TEST_ENVIRONMENT_ID, subcmd, '--',
                             *subcmd_args)

        fake_exec.Verify()
コード例 #25
0
  def testExportGcsDestinationHasSlashAdded(self, isdir_mock, exec_mock):
    """Tests that a trailing slash is automatically added to gs:// dests."""
    source = 'c/d'
    env_ref = parsers.ParseEnvironment(self.TEST_ENVIRONMENT_NAME)

    self.ExpectEnvironmentGet(
        self.TEST_PROJECT,
        self.TEST_LOCATION,
        self.TEST_ENVIRONMENT_ID,
        response=self.MakeEnvironmentWithBucket())

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec

    fake_exec.AddCallback(
        0,
        self.MakeGsutilExecCallback(
            ['-m', 'cp', '-r']
            + [posixpath.join(self.test_gcs_bucket_path, source)]
            + ['gs://subdir/']))

    storage_util.Export(
        env_ref, source, 'gs://subdir', release_track=self.track)
    fake_exec.Verify()
コード例 #26
0
  def testRunKubectlCommandSearchesEntirePath(
      self, exec_mock, tmp_kubeconfig_mock, config_paths_mock,
      find_executable_mock):
    kubectl_args = ['exec', '-it', 'airflow-worker12345', 'bash']

    fake_exec = kubectl_util.FakeExec()
    exec_mock.side_effect = fake_exec
    tmp_kubeconfig_mock.side_effect = self.FakeTemporaryKubeconfig
    fake_exec.AddCallback(0, lambda *_, **__: 0)

    config_paths_mock.sdk_bin_path = self.TEST_GCLOUD_PATH

    # Find the executable only when searching entire path, not just SDK location
    def _FakeFindExecutableOnFullPath(executable, path=None, **_):
      if executable == 'kubectl':
        if path is None:
          return base.KubectlShellingUnitTest.TEST_KUBECTL_PATH
      return None

    find_executable_mock.side_effect = _FakeFindExecutableOnFullPath

    # An error would be thrown if kubectl path was not found
    command_util.RunKubectlCommand(kubectl_args)
    fake_exec.Verify()