def createProduct(self, product): self.auth.requireProductCreationRights() if not product.name: raise errors.InvalidItem("Product name must be specified") if self.cfg.rBuilderOnline or not product.domainname: product.domainname = self.cfg.projectDomainName.split(':')[0] projects._validateShortname(product.shortname, product.domainname, reservedHosts) projects._validateHostname(product.hostname, product.domainname, reservedHosts) if product.namespace: projects._validateNamespace(product.namespace) else: #If none was set use the default namespace set in config product.namespace = self.cfg.namespace # validate the label, which will be added later. This is done # here so the project is not created before this error occurs if product.version is None: product.version = '1' projects._validateProductVersion(product.version) label = '%s.%s@%s:%s-%s-devel' % (product.hostname, product.domainname, product.namespace, product.hostname, product.version) if projects.validLabel.match(label) == None: raise mint_error.InvalidLabel(label) prodtype = product.prodtype if not prodtype: prodtype = 'Appliance' elif prodtype not in ('Appliance', 'Component', 'Platform', 'Repository', 'PlatformFoundation'): raise mint_error.InvalidProdType fqdn = ".".join((product.hostname, product.domainname)) projecturl = product.projecturl if (projecturl and not (projecturl.startswith('https://') or projecturl.startswith('http://'))): product.projecturl = "http://" + projecturl for attr in ('projecturl', 'description', 'commitEmail'): if getattr(product, attr) is None: setattr(product, attr, '') if self.cfg.hideNewProjects: product.hidden = True elif product.hidden is None: product.hidden = False productId = self.productMgr.createProduct(product.name, product.description, product.hostname, product.domainname, product.namespace, product.projecturl, product.shortname, product.prodtype, product.version, product.commitEmail, isPrivate=product.hidden) product.productId = productId return product
def createProductVersion(self, fqdn, version, namespace, description, platformLabel): product = self.getProduct(fqdn) if not namespace: namespace = product.namespace projectId = product.productId # Check the namespace projects._validateNamespace(namespace) # make sure it is a valid product version projects._validateProductVersion(version) # initial product definition prodDef = helperfuncs.sanitizeProductDefinition(product.name, description, product.repositoryHostname, product.shortname, version, '', namespace) label = prodDef.getDefaultLabel() # validate the label, which will be added later. This is done # here so the project is not created before this error occurs if projects.validLabel.match(label) == None: raise mint_error.InvalidLabel(label) if platformLabel: cclient = self.reposMgr.getUserClient() prodDef.rebase(cclient, platformLabel) self.setProductVersionDefinition(fqdn, version, prodDef) try: versionId = self.db.db.productVersions.new(projectId=projectId, namespace=namespace, name=version, description=description, label=prodDef.getProductDefinitionLabel(), timeCreated=time.time()) except mint_error.DuplicateItem: raise mint_error.DuplicateProductVersion if product.prodtype == 'Appliance' or product.prodtype == 'PlatformFoundation': groupName = helperfuncs.getDefaultImageGroupName(product.hostname) className = util.convertPackageNameToClassName(groupName) # convert from unicode recipeStr = str(templates.write(groupTemplate, cfg = self.cfg, groupApplianceLabel=platformLabel, groupName=groupName, recipeClassName=className, version=version) + '\n') self.reposMgr.createSourceTrove(fqdn, groupName, label, version, {'%s.recipe' % groupName: recipeStr}, 'Initial appliance image group template') return versionId