Ejemplo n.º 1
0
 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,
                 )
Ejemplo n.º 2
0
 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
             )
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
 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))
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
    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))
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
0
    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
            ]
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
0
 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)
Ejemplo n.º 17
0
 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)
Ejemplo n.º 18
0
    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
Ejemplo n.º 19
0
    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
Ejemplo n.º 20
0
 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)