4141 heritage: deis
4242"""
4343
44- SECRET_TEMPLATE = """\
45- kind: Secret
46- apiVersion: v1
47- metadata:
48- name: $name
49- namespace: $id
50- labels:
51- app: $id
52- heritage: deis
53- type: $type
54- data: {}
55- """
56-
5744
5845class KubeException (Exception ):
5946 def __init__ (self , * args , ** kwargs ):
@@ -454,6 +441,11 @@ def _set_container(self, namespace, container_name, data, **kwargs): # noqa
454441 if env :
455442 # env vars are stored in secrets and mapped to env in k8s
456443 try :
444+ labels = {
445+ 'version' : kwargs .get ('version' ),
446+ 'type' : 'env'
447+ }
448+
457449 # secrets use dns labels for keys, map those properly here
458450 secrets_env = {}
459451 for key , value in env .items ():
@@ -462,13 +454,9 @@ def _set_container(self, namespace, container_name, data, **kwargs): # noqa
462454 secret_name = "{}-{}-env" .format (namespace , kwargs .get ('version' ))
463455 self .get_secret (namespace , secret_name )
464456 except KubeHTTPException :
465- labels = {
466- 'version' : kwargs .get ('version' ),
467- 'type' : 'env'
468- }
469457 self .create_secret (namespace , secret_name , secrets_env , labels = labels )
470458 else :
471- self .update_secret (namespace , secret_name , secrets_env )
459+ self .update_secret (namespace , secret_name , secrets_env , labels = labels )
472460
473461 for key in env .keys ():
474462 item = {
@@ -562,7 +550,12 @@ def _set_image_secret(self, data, namespace, **kwargs):
562550 secret_type = 'kubernetes.io/dockerconfigjson'
563551 )
564552 else :
565- self .update_secret (namespace , secret_name , secret_data )
553+ self .update_secret (
554+ namespace ,
555+ secret_name ,
556+ secret_data ,
557+ secret_type = 'kubernetes.io/dockerconfigjson'
558+ )
566559
567560 # apply image pull secret to a Pod spec
568561 data ['imagePullSecrets' ] = [{'name' : secret_name }]
@@ -1030,7 +1023,7 @@ def _default_dockerapp_readiness_probe(self, port, delay=5, timeout=5, period_se
10301023 return readinessprobe
10311024
10321025 # SECRETS #
1033- # http://kubernetes.io/v1.1/ docs/api-reference/v1/definitions.html #_v1_secret
1026+ # http://kubernetes.io/docs/api-reference/v1/definitions/ #_v1_secret
10341027 def get_secret (self , namespace , name ):
10351028 url = self ._api ("/namespaces/{}/secrets/{}" , namespace , name )
10361029 response = self .session .get (url )
@@ -1060,25 +1053,38 @@ def get_secrets(self, namespace, **kwargs):
10601053
10611054 return response
10621055
1063- def create_secret (self , namespace , name , data , secret_type = 'Opaque' , labels = {}):
1056+ def _build_secret_manifest (self , namespace , name , data , secret_type = 'Opaque' , labels = {}):
10641057 secret_types = ['Opaque' , 'kubernetes.io/dockerconfigjson' ]
10651058 if secret_type not in secret_types :
10661059 raise KubeException ('{} is not a supported secret type. Use one of the following: ' .format (secret_type , ', ' .join (secret_types ))) # noqa
10671060
1068- manifest = ruamel .yaml .load (string .Template (SECRET_TEMPLATE ).substitute ({
1069- "id" : namespace ,
1070- "name" : name ,
1071- "type" : secret_type
1072- }))
1061+ manifest = {
1062+ 'kind' : 'Secret' ,
1063+ 'apiVersion' : 'v1' ,
1064+ 'metadata' : {
1065+ 'name' : name ,
1066+ 'namespace' : namespace ,
1067+ 'labels' : {
1068+ 'app' : namespace ,
1069+ 'heritage' : 'deis'
1070+ }
1071+ },
1072+ 'type' : secret_type ,
1073+ 'data' : {}
1074+ }
10731075
10741076 # add in any additional label info
10751077 manifest ['metadata' ]['labels' ].update (labels )
10761078
10771079 for key , value in data .items ():
10781080 value = value if isinstance (value , bytes ) else bytes (value , 'UTF-8' )
10791081 item = base64 .b64encode (value ).decode (encoding = 'UTF-8' )
1080- manifest ["data" ].update ({key : item })
1082+ manifest ['data' ].update ({key : item })
1083+
1084+ return manifest
10811085
1086+ def create_secret (self , namespace , name , data , secret_type = 'Opaque' , labels = {}):
1087+ manifest = self ._build_secret_manifest (namespace , name , data , secret_type , labels )
10821088 url = self ._api ("/namespaces/{}/secrets" , namespace )
10831089 response = self .session .post (url , json = manifest )
10841090 if unhealthy (response .status_code ):
@@ -1089,17 +1095,10 @@ def create_secret(self, namespace, name, data, secret_type='Opaque', labels={}):
10891095
10901096 return response
10911097
1092- def update_secret (self , namespace , name , data ):
1093- # only update the data attribute
1094- secret = self .get_secret (namespace , name ).json ()
1095-
1096- for key , value in data .items ():
1097- value = value if isinstance (value , bytes ) else bytes (value , 'UTF-8' )
1098- item = base64 .b64encode (value ).decode (encoding = 'UTF-8' )
1099- secret ["data" ].update ({key : item })
1100-
1098+ def update_secret (self , namespace , name , data , secret_type = 'Opaque' , labels = {}):
1099+ manifest = self ._build_secret_manifest (namespace , name , data , secret_type , labels )
11011100 url = self ._api ("/namespaces/{}/secrets/{}" , namespace , name )
1102- response = self .session .put (url , json = secret )
1101+ response = self .session .put (url , json = manifest )
11031102 if unhealthy (response .status_code ):
11041103 raise KubeHTTPException (
11051104 response ,
0 commit comments