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)
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
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
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)
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
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
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
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 ))
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
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))