Example #1
0
    def POST(self):
        """:returns: JSONized Cluster object.
        :http: * 201 (cluster successfully created)
               * 400 (invalid cluster data specified)
               * 409 (cluster with such parameters already exists)
        """
        # It's used for cluster creating only.
        data = self.checked_data()

        cluster = Cluster()
        cluster.release = db().query(Release).get(data["release"])
        # TODO(NAME): use fields
        for field in ('name', 'mode', 'net_manager'):
            if data.get(field):
                setattr(cluster, field, data.get(field))
        db().add(cluster)
        db().commit()
        attributes = Attributes(
            editable=cluster.release.attributes_metadata.get("editable"),
            generated=cluster.release.attributes_metadata.get("generated"),
            cluster=cluster
        )
        attributes.generate_fields()

        netmanager = NetworkManager()
        try:
            netmanager.create_network_groups(cluster.id)

            cluster.add_pending_changes("attributes")
            cluster.add_pending_changes("networks")

            if 'nodes' in data and data['nodes']:
                nodes = db().query(Node).filter(
                    Node.id.in_(data['nodes'])
                ).all()
                map(cluster.nodes.append, nodes)
                db().commit()
                for node in nodes:
                    netmanager.allow_network_assignment_to_all_interfaces(
                        node.id
                    )
                    netmanager.assign_networks_to_main_interface(node.id)

            raise web.webapi.created(json.dumps(
                ClusterHandler.render(cluster),
                indent=4
            ))
        except (
            errors.OutOfVLANs,
            errors.OutOfIPs,
            errors.NoSuitableCIDR,
            errors.InvalidNetworkPool
        ) as e:
            # Cluster was created in this request,
            # so we no need to use ClusterDeletionManager.
            # All relations wiil be cascade deleted automaticly.
            # TODO(NAME): investigate transactions
            db().delete(cluster)

            raise web.badrequest(e.message)
Example #2
0
 def validate(cls, data):
     d = cls.validate_json(data)
     if "name" not in d:
         raise errors.InvalidData("No release name specified",
                                  log_message=True)
     if "version" not in d:
         raise errors.InvalidData("No release version specified",
                                  log_message=True)
     if db().query(Release).filter_by(name=d["name"],
                                      version=d["version"]).first():
         raise errors.AlreadyExists(
             "Release with the same name and version "
             "already exists",
             log_message=True)
     if "networks_metadata" in d:
         # TODO(enchantner): additional validation
         for network in d["networks_metadata"]:
             if "name" not in network:
                 raise errors.InvalidData("Invalid network data: %s" %
                                          str(network),
                                          log_message=True)
     else:
         d["networks_metadata"] = []
     if "attributes_metadata" not in d:
         d["attributes_metadata"] = {}
     else:
         try:
             Attributes.validate_fixture(d["attributes_metadata"])
         except Exception:
             raise errors.InvalidData(
                 "Invalid logical structure of attributes metadata",
                 log_message=True)
     return d
Example #3
0
 def validate(cls, data):
     d = cls.validate_json(data)
     if not "name" in d:
         raise web.webapi.badrequest(message="No release name specified")
     if not "version" in d:
         raise web.webapi.badrequest(message="No release version specified")
     if cls.db.query(Release).filter_by(name=d["name"],
                                        version=d["version"]).first():
         raise web.webapi.conflict
     if "networks_metadata" in d:
         for network in d["networks_metadata"]:
             if not "name" in network or not "access" in network:
                 raise web.webapi.badrequest(
                     message="Invalid network data: %s" % str(network))
             if network["access"] not in settings.NETWORK_POOLS:
                 raise web.webapi.badrequest(
                     message="Invalid access mode for network")
     else:
         d["networks_metadata"] = []
     if not "attributes_metadata" in d:
         d["attributes_metadata"] = {}
     else:
         try:
             Attributes.validate_fixture(d["attributes_metadata"])
         except:
             raise web.webapi.badrequest(
                 message="Invalid logical structure of attributes metadata")
     return d
Example #4
0
    def POST(self):
        """
        :returns: JSONized Cluster object.
        :http: * 201 (cluster successfully created)
               * 400 (invalid cluster data specified)
               * 409 (cluster with such parameters already exists)
        """
        # It's used for cluster creating only.
        data = self.checked_data()

        cluster = Cluster()
        cluster.release = db().query(Release).get(data["release"])
        # TODO: use fields
        for field in ('name', 'mode', 'net_manager'):
            if data.get(field):
                setattr(cluster, field, data.get(field))
        db().add(cluster)
        db().commit()
        attributes = Attributes(
            editable=cluster.release.attributes_metadata.get("editable"),
            generated=cluster.release.attributes_metadata.get("generated"),
            cluster=cluster
        )
        attributes.generate_fields()

        netmanager = NetworkManager()
        try:
            netmanager.create_network_groups(cluster.id)

            cluster.add_pending_changes("attributes")
            cluster.add_pending_changes("networks")

            if 'nodes' in data and data['nodes']:
                nodes = db().query(Node).filter(
                    Node.id.in_(data['nodes'])
                ).all()
                map(cluster.nodes.append, nodes)
                db().commit()
                for node in nodes:
                    netmanager.allow_network_assignment_to_all_interfaces(
                        node.id
                    )
                    netmanager.assign_networks_to_main_interface(node.id)

            raise web.webapi.created(json.dumps(
                ClusterHandler.render(cluster),
                indent=4
            ))
        except (
            errors.OutOfVLANs,
            errors.OutOfIPs,
            errors.NoSuitableCIDR
        ) as e:
            # Cluster was created in this request,
            # so we no need to use ClusterDeletionManager.
            # All relations wiil be cascade deleted automaticly.
            # TODO: investigate transactions
            db().delete(cluster)

            raise web.badrequest(e.message)
Example #5
0
 def validate(cls, data):
     d = cls.validate_json(data)
     if not "name" in d:
         raise errors.InvalidData("No release name specified",
                                  log_message=True)
     if not "version" in d:
         raise errors.InvalidData("No release version specified",
                                  log_message=True)
     if db().query(Release).filter_by(name=d["name"],
                                      version=d["version"]).first():
         raise errors.AlreadyExists(
             "Release with the same name and version "
             "already exists",
             log_message=True)
     if "networks_metadata" in d:
         for network in d["networks_metadata"]:
             if not "name" in network or not "access" in network:
                 raise errors.InvalidData("Invalid network data: %s" %
                                          str(network),
                                          log_message=True)
             if network["access"] not in settings.NETWORK_POOLS:
                 raise errors.InvalidData("Invalid access mode for network",
                                          log_message=True)
     else:
         d["networks_metadata"] = []
     if not "attributes_metadata" in d:
         d["attributes_metadata"] = {}
     else:
         try:
             Attributes.validate_fixture(d["attributes_metadata"])
         except:
             raise errors.InvalidData(
                 "Invalid logical structure of attributes metadata",
                 log_message=True)
     return d
Example #6
0
 def validate(cls, data):
     d = cls.validate_json(data)
     if "name" not in d:
         raise errors.InvalidData(
             "No release name specified",
             log_message=True
         )
     if "version" not in d:
         raise errors.InvalidData(
             "No release version specified",
             log_message=True
         )
     if db().query(Release).filter_by(
         name=d["name"],
         version=d["version"]
     ).first():
         raise errors.AlreadyExists(
             "Release with the same name and version "
             "already exists",
             log_message=True
         )
     if "networks_metadata" in d:
         for network in d["networks_metadata"]:
             if not "name" in network or not "access" in network:
                 raise errors.InvalidData(
                     "Invalid network data: %s" % str(network),
                     log_message=True
                 )
             if network["access"] not in settings.NETWORK_POOLS:
                 raise errors.InvalidData(
                     "Invalid access mode for network",
                     log_message=True
                 )
     else:
         d["networks_metadata"] = []
     if "attributes_metadata" not in d:
         d["attributes_metadata"] = {}
     else:
         try:
             Attributes.validate_fixture(d["attributes_metadata"])
         except Exception:
             raise errors.InvalidData(
                 "Invalid logical structure of attributes metadata",
                 log_message=True
             )
     return d
Example #7
0
 def validate(cls, data):
     d = cls.validate_json(data)
     if "name" not in d:
         raise errors.InvalidData(
             "No release name specified",
             log_message=True
         )
     if "version" not in d:
         raise errors.InvalidData(
             "No release version specified",
             log_message=True
         )
     if db().query(Release).filter_by(
         name=d["name"],
         version=d["version"]
     ).first():
         raise errors.AlreadyExists(
             "Release with the same name and version "
             "already exists",
             log_message=True
         )
     if "networks_metadata" in d:
         # TODO(enchantner): additional validation
         meta = d["networks_metadata"]["nova_network"]
         for network in meta["networks"]:
             if "name" not in network:
                 raise errors.InvalidData(
                     "Invalid network data: %s" % str(network),
                     log_message=True
                 )
     else:
         d["networks_metadata"] = {}
     if "attributes_metadata" not in d:
         d["attributes_metadata"] = {}
     else:
         try:
             Attributes.validate_fixture(d["attributes_metadata"])
         except Exception:
             raise errors.InvalidData(
                 "Invalid logical structure of attributes metadata",
                 log_message=True
             )
     return d
Example #8
0
    def POST(self):
        # It's used for cluster creating only.
        data = self.validator.validate(web.data())

        cluster = Cluster()
        cluster.release = self.db.query(Release).get(data["release"])
        # TODO: use fields
        for field in ('name', 'type', 'mode', 'net_manager'):
            if data.get(field):
                setattr(cluster, field, data.get(field))
        self.db.add(cluster)
        self.db.commit()

        attributes = Attributes(
            editable=cluster.release.attributes_metadata.get("editable"),
            generated=cluster.release.attributes_metadata.get("generated"),
            cluster=cluster
        )
        attributes.generate_fields()

        netmanager = NetworkManager()
        netmanager.create_network_groups(cluster.id)

        cluster.add_pending_changes("attributes")
        cluster.add_pending_changes("networks")

        if 'nodes' in data and data['nodes']:
            nodes = self.db.query(Node).filter(
                Node.id.in_(data['nodes'])
            ).all()
            map(cluster.nodes.append, nodes)
            for node in nodes:
                self.allow_network_assignment_to_all_interfaces(node)
                self.assign_networks_to_main_interface(node)
            self.db.commit()

        raise web.webapi.created(json.dumps(
            ClusterHandler.render(cluster),
            indent=4
        ))
Example #9
0
 def validate(cls, data):
     d = cls.validate_json(data)
     if not "name" in d:
         raise web.webapi.badrequest(
             message="No release name specified"
         )
     if not "version" in d:
         raise web.webapi.badrequest(
             message="No release version specified"
         )
     if cls.db.query(Release).filter_by(
         name=d["name"],
         version=d["version"]
     ).first():
         raise web.webapi.conflict
     if "networks_metadata" in d:
         for network in d["networks_metadata"]:
             if not "name" in network or not "access" in network:
                 raise web.webapi.badrequest(
                     message="Invalid network data: %s" % str(network)
                 )
             if network["access"] not in settings.NETWORK_POOLS:
                 raise web.webapi.badrequest(
                     message="Invalid access mode for network"
                 )
     else:
         d["networks_metadata"] = []
     if not "attributes_metadata" in d:
         d["attributes_metadata"] = {}
     else:
         try:
             Attributes.validate_fixture(d["attributes_metadata"])
         except:
             raise web.webapi.badrequest(
                 message="Invalid logical structure of attributes metadata"
             )
     return d
Example #10
0
    def POST(self):
        # It's used for cluster creating only.
        data = self.validator.validate(web.data())

        cluster = Cluster()
        cluster.release = self.db.query(Release).get(data["release"])
        # TODO: use fields
        for field in ('name', 'type', 'mode', 'net_manager'):
            if data.get(field):
                setattr(cluster, field, data.get(field))
        self.db.add(cluster)
        self.db.commit()

        attributes = Attributes(
            editable=cluster.release.attributes_metadata.get("editable"),
            generated=cluster.release.attributes_metadata.get("generated"),
            cluster=cluster)
        attributes.generate_fields()

        netmanager = NetworkManager()
        netmanager.create_network_groups(cluster.id)

        cluster.add_pending_changes("attributes")
        cluster.add_pending_changes("networks")

        if 'nodes' in data and data['nodes']:
            nodes = self.db.query(Node).filter(Node.id.in_(
                data['nodes'])).all()
            map(cluster.nodes.append, nodes)
            for node in nodes:
                self.allow_network_assignment_to_all_interfaces(node)
                self.assign_networks_to_main_interface(node)
            self.db.commit()

        raise web.webapi.created(
            json.dumps(ClusterHandler.render(cluster), indent=4))