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.')
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')
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')
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/')
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)
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.')
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()
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')
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)
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()