import base64 import logging import kubernetes.client import urllib3.response import yaml from kubernetes.client import ApiException from kubernetes.client.rest import RESTResponse _result_deleted = { 'api_version': 'v1', 'code': None, 'details': None, 'kind': 'Namespace', 'message': None, 'metadata': { '_continue': None, 'remaining_item_count': None, 'resource_version': '4424', 'self_link': '/api/v1/namespaces/mydep3', }, 'reason': None, 'status': "{'phase': 'Terminating'}", } _result_not_found = ApiException( RESTResponse( urllib3.response.HTTPResponse( body=b'{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"namespaces \\"mydep3\\" not found","reason":"NotFound","details":{"name":"mydep3","kind":"namespaces"},"code":404}', status=404, ) ) ) kubeconfig = yaml.load( ''' apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREekNDQWZlZ0F3SUJBZ0lVVjhlN3pIa0Q5SitzcnJuN1Ywb0Zka2ZTaFQ0d0RRWUpLb1pJaHZjTkFRRUwKQlFBd0Z6RVZNQk1HQTFVRUF3d01NVEF1TVRVeUxqRTRNeTR4TUI0WERUSXlNREl3TnpBME1qY3dNVm9YRFRNeQpNREl3TlRBME1qY3dNVm93RnpFVk1CTUdBMVVFQXd3TU1UQXVNVFV5TGpFNE15NHhNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0UDNFSkozUXlxbzF4c2ducTh1dXY5Yk9yVks1QmQzOTBwWGcKUVlpMTBnZmd5UzBrWnZ6RFRFYXYzTmNKRnk0N2puYmdkVFF3em1YcHo5SFpKcFRZQUM0M0M1T2hEcHNFZzZEQQo2cVZYcmcrVjhObUlXelRMRk5wT2o2eUFvNnN0V3VqSkpyNDBkR0s1ZE5zT3QwMk9uMElOTkV1MHMraU5uc21tCkhNSFlhc3FXL0YvekFyR0psTTkwUjNtL05wZHdhMWxXcCtKY0lHYnQ3TmRyY21SV05HL3RyU05XQVZZTStrenQKVm02YUIweWZZdTRiUHB3bEtCVU43SjhqdCtJWWQwSmdiMmliUXd6V2VnTVdIU050b0ZtVEN1WVNqYTVTKzVheQpMeGE1R3BaY3B3UUo1dGcvRjFZNTU5QTZkS1gycjFtRzBzS2NIZDk0ZE1IT1FRYVRqd0lEQVFBQm8xTXdVVEFkCkJnTlZIUTRFRmdRVVM2T3l6MkZyNlBVR01Hdk9TSFhVckcvVitBb3dId1lEVlIwakJCZ3dGb0FVUzZPeXoyRnIKNlBVR01Hdk9TSFhVckcvVitBb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQwpBUUVBU0d2bnY3NHNJb2hvcC9DWWpJSHpLMTJGWS9PUmZqUUNNR0tMRGhjN3dEMENXMFhjaHRaQmsrc3VLZVFuCnNJTTlub0k2TStJZGxWM2xCUlBpU1p6ZWpPV2FiZmpHak5MOWw1RGRyVjByNnBtN3p0ckNQU0lXdVY5N29LMTMKVnIwNlVpM2l3ZTM5M00rTlZmYjlxd2wzaGlMUGZ1c0hKM3ZJRGdKWjMyeTI0S2VMekc4QWJTcFJXYjVjWUcvRApQSmpaZGh4bzVjanF0SnZONXBCZ1JlYWdoZTRKdVZKRkh0VWgyYTQrR1F1QjQyVGNIZnFnaEF5TmtkblpIVWRjCmRjOWordFM2YW9xZTRHWEY2bkplcGhSalNaRXEwb1J4MStnR2tvUENkdkdoTGV2ZDRvaUV6eWprYzM1eWNYanQKOTNGOWQzaENxckhQRDBPaW4vQkN0Rk0vclE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== server: https://142.132.167.243:16443 name: microk8s-cluster contexts: - context: cluster: microk8s-cluster user: admin name: microk8s current-context: microk8s kind: Config preferences: {} users: - name: admin user: token: VU96c211SXRDNlg0WUZOTUh0dHpYd2luNy84Ulh0Y2Nka09wWGlmOTQ1ST0K ''' ) logger = logging.getLogger(__name__) class KubernetesService: def __init__(self, client: kubernetes.client.CoreV1Api): self.client = client @classmethod def new(cls, kubeconfig: dict): api_client = kubernetes.config.new_client_from_config_dict(kubeconfig) v1_client = kubernetes.client.CoreV1Api(api_client) return cls(v1_client) def delete_namespace(self, namespace_name: str) -> None: # just in case assert ( namespace_name not in [ 'kube-system', 'kube-public', 'kube-node-lease', 'default', ] or not namespace_name.startswith('kube-') ), 'protected namespaces cannot be deleted' try: _ = self.client.delete_namespace(namespace_name) except ApiException as e: if e.status != 404: # nocover raise logger.error( 'Namespace not found', extra={ 'namespace_name': namespace_name, 'response_body': e.body, }, ) def main(): kubernetes.config.load_kube_config_from_dict(kubeconfig) client = kubernetes.client.CoreV1Api() env = { 'AWS_ACCESS_KEY': 'aws', 'AWS_ACCESS_SECRET_KEY': 'secret', } secret = client.read_namespaced_secret('env', 'default') secret_names = list(secret.data.keys()) # ['AWS_ACCESS_KEY', 'AWS_ACCESS_SECRET_KEY'] secret = kubernetes.client.V1Secret( api_version='v1', metadata={'name': 'env'}, data={k: base64.b64encode(v.encode()).decode() for k, v in env.items()}, immutable=True, kind='Secret', type='Opaque', ) res = client.create_namespaced_secret('default', secret) print(res) # if __name__ == '__main__': main()