def discover(conf: Config) -> KubeCtl: if conf.get_arg('KG_CONN_TYPE') == 'LOCAL': return local_kubectl_conn()(conf) if conf.get_arg('KG_CONN_TYPE') == 'GKE': return gke_conn()(conf) if conf.has_arg('KG_SERVICE_ACCOUNT_B64'): return gke_conn()(conf) else: return local_kubectl_conn()(conf)
def mock_kubectl(self, cluster_name: str, command: str, return_value: E.Either[Any, Any]): cmd = '{cwd}/{cache_dir_name}/kubectl ' \ '--kubeconfig {cwd}/{cache_dir_name}/{cluster_name}-kubeconfig.yaml {command}' \ .format(cache_dir_name=Config.cache_folder_name(), cwd=MockFileSystem.cwd(), cluster_name=cluster_name, command=command) PyMock.mock(self.os_system.run, args=[cmd, MatchArg.any()], return_values=[return_value])
def mock_gcloud_download(self, return_value: E.Either[Any, Any]): os = 'darwin' if self.os_system.is_macos() else 'linux' cmd = 'cd {cwd}/{cache_dir_name} && ' \ 'curl -L https://dl.google.com/dl/cloudsdk/channels/rapid/' \ 'downloads/google-cloud-sdk-284.0.0-{os}-x86_64.tar.gz | tar zx' \ .format(cache_dir_name=Config.cache_folder_name(), cwd=MockFileSystem.cwd(), os=os) PyMock.mock(self.os_system.run, args=[cmd, MatchArg.any()], return_values=[return_value])
def mock_download_install_kubectl(self, version: str, return_value: E.Either[Any, Any]): os = 'darwin' if self.os_system.is_macos() else 'linux' cmd = 'curl -L https://storage.googleapis.com/kubernetes-release/release' \ '/{version}/bin/{os}/amd64/kubectl > {cwd}/{cache_dir_name}/kubectl && ' \ 'chmod u+x {cwd}/{cache_dir_name}/kubectl'\ .format(version=version, cache_dir_name=Config.cache_folder_name(), cwd=MockFileSystem.cwd(), os=os) PyMock.mock(self.os_system.run, args=[cmd, MatchArg.any()], return_values=[return_value])
def mock_create_kube_config(self, cluster_name: str, return_value: E.Either[Any, Any]): cmd = '{script_dir}/create-kube-config.sh {cluster_name} {cwd}/{cache_dir_name} ' \ '{cwd}/{cache_dir_name}/service_account.json ' \ '"{cwd}/{cache_dir_name}/{cluster_name}-kubeconfig.yaml" project1' \ .format(cache_dir_name=Config.cache_folder_name(), cwd=MockFileSystem.cwd(), cluster_name=cluster_name, script_dir=MockFileSystem.script_dir()) PyMock.mock(self.os_system.run, args=[cmd, MatchArg.any()], return_values=[return_value])
def create_kubectl(conf: Config): regex = conf.get_arg('KG_CLUSTER_REGEX', cluster_regex) if regex is None: conf.log.error( 'gke_conn: cluster_regex required. Either pass cluster_regex or set env var KG_CLUSTER_REGEX' ) sys.exit(1) return KubeCtl(conf, GKEProvider(project_id, service_account_b64, conf), regex)
def mock_clusters_list(self, cluster_names: List[str]): for cluster_name in cluster_names: self.mock_create_kube_config(cluster_name, return_value=E.success()) self.mock_kubectl_apply_temp_file(cluster_name, return_value=E.success()) cmd = '{cwd}/{cache_dir_name}/google-cloud-sdk/bin/gcloud container clusters list --format=\"value(name)\"' \ .format(cache_dir_name=Config.cache_folder_name(), cwd=MockFileSystem.cwd()) PyMock.mock(self.os_system.run, args=[cmd, MatchArg.any()], return_values=[E.success('\n'.join(cluster_names))])
def mock_glob_kubeconfigs(self, cluster_configs: List[str]): PyMock.mock(self.file_system.glob, args=[ '{cwd}/{cache_dir}/*kubeconfig.yaml'.format( cwd=self.file_system.cwd(), cache_dir=Config.cache_folder_name()) ], return_values=[cluster_configs]) return self
def mock_activate_service_account(self, key_file_path: str, return_values: List[E.Either[Any, Any]]): cmd = '{cwd}/{cache_dir_name}/google-cloud-sdk/bin/gcloud auth activate-service-account --key-file ' \ '{cwd}/{cache_dir_name}/{key_file}' \ .format(cache_dir_name=Config.cache_folder_name(), cwd=MockFileSystem.cwd(), key_file=key_file_path) PyMock.mock(self.os_system.run, args=[cmd, MatchArg.any()], return_values=return_values)
def mock_set_project_id(self, project_id: str, return_values: List[E.Either[Any, Any]]): cmd = '{cwd}/{cache_dir_name}/google-cloud-sdk/bin/gcloud config set project {project}' \ .format(cache_dir_name=Config.cache_folder_name(), cwd=MockFileSystem.cwd(), project=project_id) PyMock.mock(self.os_system.run, args=[cmd, MatchArg.any()], return_values=return_values)
def script_dir(): return '/rel_to_file/./' + Config.scripts_folder_name()
def _get_service_account_info(service_account_b64: str, config: Config): service_account_b64 = config.get_arg('KG_SERVICE_ACCOUNT_B64', service_account_b64, ensure=True) return json.loads(b64decode(service_account_b64).decode("utf-8"))
def _get_project_id(project_id, config: Config): return config.get_arg('KG_PROJECT_ID', project_id, ensure=True)