def insert_or_update(self, deployment_pb): with create_session(self.sess_maker) as sess: try: deployment_obj = (sess.query(Deployment).filter_by( name=deployment_pb.name, namespace=deployment_pb.namespace).one()) if deployment_obj: # updating deployment record in db _deployment_pb_to_orm_obj(deployment_pb, deployment_obj) if deployment_pb.labels: add_or_update_labels( sess, RESOURCE_TYPE.deployment, deployment_obj.id, deployment_pb.labels, ) except NoResultFound: deployment_orm_obj = _deployment_pb_to_orm_obj(deployment_pb) sess.add(deployment_orm_obj) if deployment_pb.labels: deployment_row = (sess.query(Deployment).filter_by( name=deployment_orm_obj.name, namespace=deployment_orm_obj.namespace, ).one()) add_labels( sess, RESOURCE_TYPE.deployment, deployment_row.id, deployment_pb.labels, )
def update_bento_service_metadata( self, bento_name, bento_version, bento_service_metadata_pb ): with create_session(self.sess_maker) as sess: try: bento_obj = ( sess.query(Bento) .filter_by(name=bento_name, version=bento_version, deleted=False) .one() ) service_metadata = ProtoMessageToDict(bento_service_metadata_pb) bento_obj.bento_service_metadata = service_metadata if service_metadata.get('labels', None) is not None: bento = ( sess.query(Bento) .filter_by(name=bento_name, version=bento_version) .one() ) add_or_update_labels( sess, RESOURCE_TYPE.bento, bento.id, service_metadata['labels'] ) except NoResultFound: raise YataiRepositoryException( "Bento %s:%s is not found in repository" % bento_name, bento_version )
def list( self, bento_name=None, offset=None, limit=None, order_by=ListBentoRequest.created_at, ascending_order=False, ): with create_session(self.sess_maker) as sess: query = sess.query(Bento) order_by = ListBentoRequest.SORTABLE_COLUMN.Name(order_by) order_by_field = getattr(Bento, order_by) order_by_action = (order_by_field if ascending_order else desc(order_by_field)) query = query.order_by(order_by_action) if bento_name: # filter_by apply filtering criterion to a copy of the query query = query.filter_by(name=bento_name) query = query.filter_by(deleted=False) # We are not defaulting limit to 200 in the signature, # because protobuf will pass 0 as value limit = limit or 200 # Limit and offset need to be called after order_by filter/filter_by is # called query = query.limit(limit) if offset: query = query.offset(offset) query_result = query.all() result = [ _bento_orm_obj_to_pb(bento_obj) for bento_obj in query_result ] return result
def update_deployment(self, name, namespace): with create_session(self.sess_maker) as sess: try: deployment_obj = (sess.query(Deployment).filter_by( name=name, namespace=namespace).one()) yield deployment_obj except NoResultFound: yield None
def add(self, bento_name, bento_version, uri, uri_type): with create_session(self.sess_maker) as sess: bento_obj = Bento() bento_obj.name = bento_name bento_obj.version = bento_version bento_obj.uri = uri bento_obj.uri_type = BentoUri.StorageType.Name(uri_type) return sess.add(bento_obj)
def get(self, name, namespace): with create_session(self.sess_maker) as sess: try: deployment_obj = (sess.query(Deployment).filter_by( name=name, namespace=namespace).one()) except NoResultFound: return None return _deployment_orm_obj_to_pb(deployment_obj)
def delete(self, name, namespace): with create_session(self.sess_maker) as sess: try: deployment = (sess.query(Deployment).filter_by( name=name, namespace=namespace).one()) return sess.delete(deployment) except NoResultFound: raise YataiDeploymentException( "Deployment '%s' in namespace: '%s' is not found" % name, namespace)
def get(self, name, namespace): with create_session(self.sess_maker) as sess: try: deployment_obj = (sess.query(Deployment).filter_by( name=name, namespace=namespace).one()) labels = get_labels(sess, RESOURCE_TYPE.deployment, deployment_obj.id) except NoResultFound: return None return _deployment_orm_obj_to_pb(deployment_obj, labels)
def insert_or_update(self, deployment_pb): with create_session(self.sess_maker) as sess: try: deployment_obj = (sess.query(Deployment).filter_by( name=deployment_pb.name, namespace=deployment_pb.namespace).one()) if deployment_obj: # updating deployment record in db _deployment_pb_to_orm_obj(deployment_pb, deployment_obj) except NoResultFound: sess.add(_deployment_pb_to_orm_obj(deployment_pb))
def _get_latest(self, bento_name): with create_session(self.sess_maker) as sess: query = (sess.query(Bento).filter_by( name=bento_name, deleted=False).order_by(desc(Bento.created_at)).limit(1)) query_result = query.all() if len(query_result) == 1: return _bento_orm_obj_to_pb(query_result[0]) else: return None
def update_bento_service_metadata(self, bento_name, bento_version, bento_service_metadata_pb): with create_session(self.sess_maker) as sess: try: bento_obj = (sess.query(Bento).filter_by(name=bento_name, version=bento_version, deleted=False).one()) bento_obj.bento_service_metadata = ProtoMessageToDict( bento_service_metadata_pb) except NoResultFound: raise YataiRepositoryException( "Bento %s:%s is not found in repository" % bento_name, bento_version)
def list( self, namespace, operator=None, labels_query=None, offset=None, limit=None, order_by=ListDeploymentsRequest.created_at, ascending_order=False, ): with create_session(self.sess_maker) as sess: query = sess.query(Deployment) order_by = ListDeploymentsRequest.SORTABLE_COLUMN.Name(order_by) order_by_field = getattr(Deployment, order_by) order_by_action = ( order_by_field if ascending_order else desc(order_by_field) ) query = query.order_by(order_by_action) if namespace != ALL_NAMESPACE_TAG: # else query all namespaces query = query.filter_by(namespace=namespace) if operator: operator_name = DeploymentSpec.DeploymentOperator.Name(operator) query = query.filter( Deployment.spec['operator'].contains(operator_name) ) if labels_query: # We only handle key=value query at the moment, the more advanced query # such as `in` or `notin` are not handled. labels_list = labels_query.split(',') for label in labels_list: if '=' not in label: raise BadInput( 'Invalid label format. Please present query in ' 'key=value format' ) label_key, label_value = label.split('=') query = query.filter( Deployment.labels[label_key].contains(label_value) ) # We are not defaulting limit to 200 in the signature, # because protobuf will pass 0 as value limit = limit or 200 # Limit and offset need to be called after order_by filter/filter_by is # called query = query.limit(limit) if offset: query = query.offset(offset) query_result = query.all() return list(map(_deployment_orm_obj_to_pb, query_result))
def dangerously_delete(self, bento_name, bento_version): with create_session(self.sess_maker) as sess: try: bento_obj = (sess.query(Bento).filter_by( name=bento_name, version=bento_version).one()) if bento_obj.deleted: raise YataiRepositoryException( "Bento {}:{} has already been deleted".format( bento_name, bento_version)) bento_obj.deleted = True except NoResultFound: raise YataiRepositoryException( "Bento %s:%s is not found in repository" % bento_name, bento_version)
def list( self, namespace, operator=None, label_selectors=None, offset=None, limit=None, order_by=ListDeploymentsRequest.created_at, ascending_order=False, ): with create_session(self.sess_maker) as sess: query = sess.query(Deployment) order_by = ListDeploymentsRequest.SORTABLE_COLUMN.Name(order_by) order_by_field = getattr(Deployment, order_by) order_by_action = (order_by_field if ascending_order else desc(order_by_field)) query = query.order_by(order_by_action) if label_selectors.match_labels or label_selectors.match_expressions: deployment_ids = filter_label_query(sess, RESOURCE_TYPE.deployment, label_selectors) query.filter(Deployment.id.in_(deployment_ids)) if namespace != ALL_NAMESPACE_TAG: # else query all namespaces query = query.filter_by(namespace=namespace) if operator: operator_name = DeploymentSpec.DeploymentOperator.Name( operator) query = query.filter( Deployment.spec['operator'].as_string().contains( operator_name)) # We are not defaulting limit to 200 in the signature, # because protobuf will pass 0 as value limit = limit or 200 # Limit and offset need to be called after order_by filter/filter_by is # called query = query.limit(limit) if offset: query = query.offset(offset) query_result = query.all() deployment_ids = [ deployment_obj.id for deployment_obj in query_result ] labels = list_labels(sess, RESOURCE_TYPE.deployment, deployment_ids) return [ _deployment_orm_obj_to_pb(deployment_obj, labels.get(str(deployment_obj.id))) for deployment_obj in query_result ]
def get(self, bento_name, bento_version="latest"): if bento_version.lower() == "latest": return self._get_latest(bento_name) with create_session(self.sess_maker) as sess: try: bento_obj = (sess.query(Bento).filter_by( name=bento_name, version=bento_version).one()) if bento_obj.deleted: # bento has been marked as deleted return None return _bento_orm_obj_to_pb(bento_obj) except NoResultFound: return None
def delete(self, name, namespace): with create_session(self.sess_maker) as sess: try: deployment = (sess.query(Deployment).filter_by( name=name, namespace=namespace).one()) delete_labels( sess, resource_type=RESOURCE_TYPE.deployment, resource_id=deployment.id, ) return sess.delete(deployment) except NoResultFound: raise YataiDeploymentException( "Deployment '%s' in namespace: '%s' is not found" % name, namespace)
def update_upload_status(self, bento_name, bento_version, upload_status_pb): with create_session(self.sess_maker) as sess: try: bento_obj = (sess.query(Bento).filter_by(name=bento_name, version=bento_version, deleted=False).one()) # TODO: # if bento_obj.upload_status and bento_obj.upload_status.updated_at > # upload_status_pb.updated_at, update should be ignored bento_obj.upload_status = ProtoMessageToDict(upload_status_pb) except NoResultFound: raise YataiRepositoryException( "Bento %s:%s is not found in repository" % bento_name, bento_version)
def get(self, bento_name, bento_version="latest"): if bento_version.lower() == "latest": return self._get_latest(bento_name) with create_session(self.sess_maker) as sess: try: bento_obj = (sess.query(Bento).filter_by(name=bento_name, version=bento_version, deleted=False).one()) if bento_obj.deleted: # bento has been marked as deleted return None labels = get_labels(sess, RESOURCE_TYPE.bento, bento_obj.id) return _bento_orm_obj_to_pb(bento_obj, labels) except NoResultFound: return None
def list( self, bento_name=None, offset=None, limit=None, label_selectors=None, order_by=ListBentoRequest.created_at, ascending_order=False, ): with create_session(self.sess_maker) as sess: query = sess.query(Bento) order_by = ListBentoRequest.SORTABLE_COLUMN.Name(order_by) order_by_field = getattr(Bento, order_by) order_by_action = ( order_by_field if ascending_order else desc(order_by_field) ) query = query.order_by(order_by_action) if bento_name: # filter_by apply filtering criterion to a copy of the query query = query.filter_by(name=bento_name) query = query.filter_by(deleted=False) if label_selectors is not None and ( label_selectors.match_labels or label_selectors.match_expressions ): bento_ids = filter_label_query( sess, RESOURCE_TYPE.bento, label_selectors ) query = query.filter(Bento.id.in_(bento_ids)) # We are not defaulting limit to 200 in the signature, # because protobuf will pass 0 as value limit = limit or DEFAULT_LIST_LIMIT # Limit and offset need to be called after order_by filter/filter_by is # called query = query.limit(limit) if offset: query = query.offset(offset) query_result = query.all() bento_ids = [bento_obj.id for bento_obj in query_result] labels = list_labels(sess, RESOURCE_TYPE.bento, bento_ids) result = [ _bento_orm_obj_to_pb(bento_obj, labels.get(str(bento_obj.id))) for bento_obj in query_result ] return result
def insert(self, deployment_pb): with create_session(self.sess_maker) as sess: deployment_obj = _deployment_pb_to_orm_obj(deployment_pb) return sess.add(deployment_obj)