def create(cls, data): """Create Cluster instance with specified parameters in DB. This includes: * creating Cluster attributes and generating default values \ (see :func:`create_attributes`) * creating NetworkGroups for Cluster * adding default pending changes (see :func:`add_pending_changes`) * if "nodes" are specified in data then they are added to Cluster \ (see :func:`update_nodes`) :param data: dictionary of key-value pairs as object fields :returns: Cluster instance """ # TODO(enchantner): fix this temporary hack in clients if "release_id" not in data: release_id = data.pop("release", None) data["release_id"] = release_id # remove read-only attribute data.pop("is_locked", None) assign_nodes = data.pop("nodes", []) enabled_editable_attributes = None if 'components' in data: enabled_core_attributes = cls.get_cluster_attributes_by_components( data['components'], data["release_id"]) data = dict_merge(data, enabled_core_attributes['cluster']) enabled_editable_attributes = enabled_core_attributes['editable'] data["fuel_version"] = settings.VERSION["release"] cluster = super(Cluster, cls).create(data) cls.create_default_group(cluster) cls.create_attributes(cluster, enabled_editable_attributes) cls.create_vmware_attributes(cluster) cls.create_default_extensions(cluster) try: cls.get_network_manager(cluster).\ create_network_groups_and_config(cluster, data) cls.add_pending_changes(cluster, consts.CLUSTER_CHANGES.attributes) cls.add_pending_changes(cluster, consts.CLUSTER_CHANGES.networks) cls.add_pending_changes(cluster, consts.CLUSTER_CHANGES.vmware_attributes) if assign_nodes: cls.update_nodes(cluster, assign_nodes) except (errors.OutOfVLANs, errors.OutOfIPs, errors.NoSuitableCIDR) as exc: raise errors.CannotCreate(exc.message) db().flush() ClusterPlugins.add_compatible_plugins(cluster) PluginManager.enable_plugins_by_components(cluster) return cluster
def create(cls, data): """Create Cluster instance with specified parameters in DB. This includes: * creating Cluster attributes and generating default values \ (see :func:`create_attributes`) * creating NetworkGroups for Cluster * adding default pending changes (see :func:`add_pending_changes`) * if "nodes" are specified in data then they are added to Cluster \ (see :func:`update_nodes`) :param data: dictionary of key-value pairs as object fields :returns: Cluster instance """ # TODO(enchantner): fix this temporary hack in clients if "release_id" not in data: release_id = data.pop("release", None) data["release_id"] = release_id # remove read-only attribute data.pop("is_locked", None) assign_nodes = data.pop("nodes", []) data["fuel_version"] = settings.VERSION["release"] new_cluster = super(Cluster, cls).create(data) cls.create_default_group(new_cluster) cls.create_attributes(new_cluster) cls.create_vmware_attributes(new_cluster) cls.create_default_extensions(new_cluster) try: cls.get_network_manager(new_cluster).\ create_network_groups_and_config(new_cluster, data) cls.add_pending_changes(new_cluster, "attributes") cls.add_pending_changes(new_cluster, "networks") cls.add_pending_changes(new_cluster, "vmware_attributes") if assign_nodes: cls.update_nodes(new_cluster, assign_nodes) except ( errors.OutOfVLANs, errors.OutOfIPs, errors.NoSuitableCIDR ) as exc: db().delete(new_cluster) raise errors.CannotCreate(exc.message) db().flush() ClusterPlugins.add_compatible_plugins(new_cluster) return new_cluster