123 lines
4.6 KiB
Python
123 lines
4.6 KiB
Python
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()
|