2929from nuvolaris .user_config import UserConfig
3030from nuvolaris .user_metadata import UserMetadata
3131
32+
3233def patchEntries (data : dict ):
33- tplp = ["milvus-cfg-base.yaml" ,"milvus.yaml" ]
34+ tplp = ["milvus-cfg-base.yaml" , "milvus.yaml" ]
3435
35- if (data ['affinity' ] or data ['tolerations' ]):
36+ if (data ['affinity' ] or data ['tolerations' ]):
3637 tplp .append ("affinity-tolerance-dep-core-attach.yaml" )
3738
3839 kust = kus .patchTemplates ("milvus" , tplp , data )
39- kust += kus .patchGenericEntry ("Secret" ,"nuvolaris-milvus-etcd-secret" ,"/data/username" ,util .b64_encode (data ['milvus_etcd_username' ]))
40- kust += kus .patchGenericEntry ("Secret" ,"nuvolaris-milvus-etcd-secret" ,"/data/password" ,util .b64_encode (data ['milvus_etcd_password' ]))
41-
42- kust += kus .patchGenericEntry ("Secret" ,"nuvolaris-milvus-s3-secret" ,"/stringData/accesskey" ,data ['milvus_s3_username' ])
43- kust += kus .patchGenericEntry ("Secret" ,"nuvolaris-milvus-s3-secret" ,"/stringData/secretkey" ,data ['milvus_s3_password' ])
44-
45- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus" ,"/spec/storageClassName" ,data ['storageClass' ])
46- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus" ,"/spec/resources/requests/storage" ,f"{ data ['size' ]} Gi" )
47-
48- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus-zookeeper" ,"/spec/storageClassName" ,data ['storageClass' ])
49- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus-zookeeper" ,"/spec/resources/requests/storage" ,f"{ data ['zookeeper_size' ]} Gi" )
40+ kust += kus .patchGenericEntry ("Secret" , "nuvolaris-milvus-etcd-secret" , "/data/username" ,
41+ util .b64_encode (data ['milvus_etcd_username' ]))
42+ kust += kus .patchGenericEntry ("Secret" , "nuvolaris-milvus-etcd-secret" , "/data/password" ,
43+ util .b64_encode (data ['milvus_etcd_password' ]))
44+
45+ kust += kus .patchGenericEntry ("Secret" , "nuvolaris-milvus-s3-secret" , "/stringData/accesskey" ,
46+ data ['milvus_s3_username' ])
47+ kust += kus .patchGenericEntry ("Secret" , "nuvolaris-milvus-s3-secret" , "/stringData/secretkey" ,
48+ data ['milvus_s3_password' ])
49+
50+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus" , "/spec/storageClassName" ,
51+ data ['storageClass' ])
52+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus" , "/spec/resources/requests/storage" ,
53+ f"{ data ['size' ]} Gi" )
54+
55+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus-zookeeper" , "/spec/storageClassName" ,
56+ data ['storageClass' ])
57+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus-zookeeper" ,
58+ "/spec/resources/requests/storage" , f"{ data ['zookeeper_size' ]} Gi" )
59+
60+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus-bookie-journal" , "/spec/storageClassName" ,
61+ data ['storageClass' ])
62+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus-bookie-journal" ,
63+ "/spec/resources/requests/storage" , f"{ data ['bookie_journal_size' ]} Gi" )
64+
65+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus-bookie-ledgers" , "/spec/storageClassName" ,
66+ data ['storageClass' ])
67+ kust += kus .patchGenericEntry ("PersistentVolumeClaim" , "nuvolaris-milvus-bookie-ledgers" ,
68+ "/spec/resources/requests/storage" , f"{ data ['bookie_ledgers_size' ]} Gi" )
69+ return kust
5070
51- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus-bookie-journal" ,"/spec/storageClassName" ,data ['storageClass' ])
52- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus-bookie-journal" ,"/spec/resources/requests/storage" ,f"{ data ['bookie_journal_size' ]} Gi" )
53-
54- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus-bookie-ledgers" ,"/spec/storageClassName" ,data ['storageClass' ])
55- kust += kus .patchGenericEntry ("PersistentVolumeClaim" ,"nuvolaris-milvus-bookie-ledgers" ,"/spec/resources/requests/storage" ,f"{ data ['bookie_ledgers_size' ]} Gi" )
56- return kust
5771
5872def create (owner = None ):
5973 """
6074 Deploys the milvus vector db in standalone mode.
6175 """
62- data = util .get_milvus_config_data ()
63- res = create_milvus_accounts (data )
76+ data = util .get_milvus_config_data ()
77+ res = create_milvus_accounts (data )
6478
6579 if res :
6680 logging .info ("*** creating a milvus standalone instance" )
@@ -72,153 +86,171 @@ def create(owner=None):
7286 else :
7387 cfg .put ("state.milvus.spec" , mspec )
7488
75- res = kube .apply (mspec )
76- util .wait_for_pod_ready (r"{.items[?(@.metadata.labels.app\.kubernetes\.io\/instance == 'nuvolaris-milvus')].metadata.name}" )
77- res = create_default_milvus_database (data )
89+ kube .apply (mspec )
90+ util .wait_for_pod_ready (
91+ r"{.items[?(@.metadata.labels.app\.kubernetes\.io\/instance == 'nuvolaris-milvus')].metadata.name}" )
92+ res = create_default_milvus_database (data )
7893 logging .info ("*** created a milvus standalone instance" )
7994
95+
8096 return res
8197
82- def create_milvus_accounts (data :dict ):
98+
99+ def create_milvus_accounts (data : dict ):
83100 """"
84101 Creates technical accounts for ETCD and MINIO
85102 """
86- try :
103+ try :
87104 # currently we use the ETCD root password, so we skip the ETCD user creation.
88- #res = util.check(etcd.create_etcd_user(data['milvus_etcd_username'],data['milvus_etcd_password'],data['milvus_etcd_prefix']),"create_etcd_milvus_user",True)
105+ # res = util.check(etcd.create_etcd_user(data['milvus_etcd_username'],data['milvus_etcd_password'],data['milvus_etcd_prefix']),"create_etcd_milvus_user",True)
89106
90107 minioClient = mutil .MinioClient ()
91108 bucket_policy_names = []
92109 bucket_policy_names .append (f"{ data ['milvus_bucket_name' ]} /*" )
93110
94- res = util .check (minioClient .add_user (data ["milvus_s3_username" ], data ["milvus_s3_password" ]),"create_milvus_s3_user" ,True )
95- res = util .check (minioClient .make_bucket (data ["milvus_bucket_name" ]),"create_milvus_s3_bucket" ,res )
96- return util .check (minioClient .assign_rw_bucket_policy_to_user (data ["milvus_s3_username" ], bucket_policy_names ),"assign_milvus_s3_bucket_policy" ,res )
111+ res = util .check (minioClient .add_user (data ["milvus_s3_username" ], data ["milvus_s3_password" ]),
112+ "create_milvus_s3_user" , True )
113+ res = util .check (minioClient .make_bucket (data ["milvus_bucket_name" ]), "create_milvus_s3_bucket" , res )
114+ return util .check (minioClient .assign_rw_bucket_policy_to_user (data ["milvus_s3_username" ], bucket_policy_names ),
115+ "assign_milvus_s3_bucket_policy" , res )
97116 except Exception as ex :
98- logging .error ("Could not create milvus ETCD and MINIO accounts" ,ex )
117+ logging .error ("Could not create milvus ETCD and MINIO accounts" , ex )
99118 return False
100-
119+
120+
101121def create_default_milvus_database (data ):
102122 """
103123 Creates nuvolaris MILVUS custom resources
104124 """
105- logging .info ("*** configuring MILVUS database for nuvolaris" )
125+ logging .info ("*** configuring MILVUS database for nuvolaris" )
106126 adminClient = MilvusAdminClient ()
107- res = adminClient .setup_user ("nuvolaris" , data ["nuvolaris_password" ],"nuvolaris" )
108-
109- if (res ):
127+ res = adminClient .setup_user ("nuvolaris" , data ["nuvolaris_password" ], "nuvolaris" )
128+
129+ if (res ):
110130 _annotate_nuv_milvus_metadata (data )
111131 logging .info ("*** configured MILVUS database for nuvolaris" )
112132 return True
113-
133+
114134 return False
115135
136+
116137def _annotate_nuv_milvus_metadata (data ):
117138 """
118139 annotate nuvolaris configmap with entries for MILVUS connectivity MILVUS_HOST, MILVUS_PORT, MILVUS_TOKEN, MILVUS_DB_NAME
119140 this is becasue MINIO
120- """
141+ """
121142 try :
122- milvus_service = util .get_service (r"{.items[?(@.metadata.labels.app\.kubernetes\.io\/instance == 'nuvolaris-milvus')]}" )
123- if (milvus_service ):
143+ milvus_service = util .get_service (
144+ r"{.items[?(@.metadata.labels.app\.kubernetes\.io\/instance == 'nuvolaris-milvus')]}" )
145+ if (milvus_service ):
124146 milvus_host = f"{ milvus_service ['metadata' ]['name' ]} .{ milvus_service ['metadata' ]['namespace' ]} .svc.cluster.local"
125147 password = data ["nuvolaris_password" ]
126-
148+
127149 openwhisk .annotate (f"milvus_host={ milvus_host } " )
128150 openwhisk .annotate (f"milvus_token=nuvolaris:{ password } " )
129151 openwhisk .annotate ("milvus_db_name=nuvolaris" )
130152
131153 ports = list (milvus_service ['spec' ]['ports' ])
132154 for port in ports :
133- if (port ['name' ]== 'milvus' ):
134- openwhisk .annotate (f"milvus_port={ port ['port' ]} " )
155+ if (port ['name' ] == 'milvus' ):
156+ openwhisk .annotate (f"milvus_port={ port ['port' ]} " )
135157 return None
136158 except Exception as e :
137159 logging .error (f"failed to annotate MILVUS for nuvolaris: { e } " )
138160 return None
139161
140- def _add_milvus_user_metadata (ucfg : UserConfig , user_metadata :UserMetadata ):
162+
163+ def _add_milvus_user_metadata (ucfg : UserConfig , user_metadata : UserMetadata ):
141164 """
142165 adds entries for MILVUS connectivity MILVUS_HOST, MILVUS_PORT, MILVUS_TOKEN, MILVUS_DB_NAME
143- """
166+ """
144167
145168 try :
146- milvus_service = util .get_service (r"{.items[?(@.metadata.labels.app\.kubernetes\.io\/instance == 'nuvolaris-milvus')]}" )
147-
148- if (milvus_service ):
169+ milvus_service = util .get_service (
170+ r"{.items[?(@.metadata.labels.app\.kubernetes\.io\/instance == 'nuvolaris-milvus')]}" )
171+
172+ if (milvus_service ):
149173 milvus_host = f"{ milvus_service ['metadata' ]['name' ]} .{ milvus_service ['metadata' ]['namespace' ]} .svc.cluster.local"
150174 milvus_token = f"{ ucfg .get ('namespace' )} :{ ucfg .get ('milvus.password' )} "
151- user_metadata .add_metadata ("MILVUS_HOST" ,milvus_host )
152- user_metadata .add_metadata ("MILVUS_TOKEN" ,milvus_token )
153- user_metadata .add_metadata ("MILVUS_DB_NAME" ,ucfg .get ('milvus.database' ))
175+ user_metadata .add_metadata ("MILVUS_HOST" , milvus_host )
176+ user_metadata .add_metadata ("MILVUS_TOKEN" , milvus_token )
177+ user_metadata .add_metadata ("MILVUS_DB_NAME" , ucfg .get ('milvus.database' ))
154178
155179 ports = list (milvus_service ['spec' ]['ports' ])
156180 for port in ports :
157- if (port ['name' ]== 'milvus' ):
158- user_metadata .add_metadata ("MILVUS_PORT" ,port ['port' ])
181+ if (port ['name' ] == 'milvus' ):
182+ user_metadata .add_metadata ("MILVUS_PORT" , port ['port' ])
159183
160184 return None
161185 except Exception as e :
162186 logging .error (f"failed to build MILVUS metadata for { ucfg .get ('namespace' )} : { e } " )
163187 return None
164188
189+
165190def create_ow_milvus (ucfg : UserConfig , user_metadata : UserMetadata , owner = None ):
166191 logging .info (f"*** configuring MILVUS database for { ucfg .get ('namespace' )} " )
167-
192+
168193 adminClient = MilvusAdminClient ()
169194 username = ucfg .get ("namespace" )
170195 password = ucfg .get ("milvus.password" )
171196 database = ucfg .get ("milvus.database" )
172- res = adminClient .setup_user (username , password ,database )
173-
174- if (res ):
197+ res = adminClient .setup_user (username , password , database )
198+
199+ if (res ):
175200 _add_milvus_user_metadata (ucfg , user_metadata )
176201 logging .info (f"*** configured MILVUS database linked to namespace { ucfg .get ('namespace' )} " )
177202
203+ return res
204+
205+
178206def delete_ow_milvus (ucfg ):
179207 logging .info (f"removing MILVUS database { ucfg .get ('namespace' )} " )
180208 adminClient = MilvusAdminClient ()
181- res = adminClient .remove_user (ucfg .get ('namespace' ),ucfg .get ('milvus.database' ))
209+ res = adminClient .remove_user (ucfg .get ('namespace' ), ucfg .get ('milvus.database' ))
182210
183211 if res :
184- logging .info (f"removed MILVUS database linked to namespace { ucfg .get ('namespace' )} " )
212+ logging .info (f"removed MILVUS database linked to namespace { ucfg .get ('namespace' )} " )
213+
214+ return res
215+
185216
186217def delete_by_owner ():
187218 spec = kus .build ("milvus" )
188219 res = kube .delete (spec )
189- logging .info (f"delete milvus: { res } " )
220+ logging .info (f"delete milvus: { res } " )
190221 return res
191222
223+
192224def delete_by_spec ():
193- spec = cfg .get ("state.milvus.spec" )
225+ spec = cfg .get ("state.milvus.spec" )
194226 if spec :
195227 res = kube .delete (spec )
196228 logging .info (f"delete milvus: { res } " )
197229 return res
198230
199-
200231
201232def delete (owner = None ):
202- if owner :
233+ if owner :
203234 return delete_by_owner ()
204235 else :
205236 return delete_by_spec ()
206237
238+
207239def patch (status , action , owner = None ):
208240 """
209241 Called by the operator patcher to create/delete milvus component
210242 """
211243 try :
212- logging .info (f"*** handling request to { action } milvus" )
213- if action == 'create' :
244+ logging .info (f"*** handling request to { action } milvus" )
245+ if action == 'create' :
214246 msg = create (owner )
215- operator_util .patch_operator_status (status ,'milvus' ,'on' )
247+ operator_util .patch_operator_status (status , 'milvus' , 'on' )
216248 else :
217- msg = delete (owner )
218- operator_util .patch_operator_status (status ,'milvus' ,'off' )
249+ msg = delete (owner )
250+ operator_util .patch_operator_status (status , 'milvus' , 'off' )
219251
220- logging .info (msg )
221- logging .info (f"*** handled request to { action } milvus" )
252+ logging .info (msg )
253+ logging .info (f"*** handled request to { action } milvus" )
222254 except Exception as e :
223- logging .error ('*** failed to update milvus: %s' % e )
224- operator_util .patch_operator_status (status ,'milvus' ,'error' )
255+ logging .error ('*** failed to update milvus: %s' % e )
256+ operator_util .patch_operator_status (status , 'milvus' , 'error' )
0 commit comments