use of org.eclipse.winery.model.ids.definitions.ArtifactTemplateId in project winery by eclipse.
the class ScriptPlugin method createDeploymentArtifact.
private String createDeploymentArtifact(ArtifactTemplateId artifactTemplate, IRepository repository, GeneratedArtifacts generatedArtifacts, String packageToInstall) {
QName packageDaId = new QName(artifactTemplate.getQName().getNamespaceURI(), VersionSupport.getNewComponentVersionId(artifactTemplate, packageToInstall + "-DA"));
ArtifactTemplateId deployArtId = new ArtifactTemplateId(packageDaId);
String generatedPackage = packageToInstall + ".tar.gz";
if (!repository.exists(deployArtId)) {
String cmd = "/usr/bin/apt download $(/usr/bin/apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts " + "--no-breaks --no-replaces --no-enhances --no-pre-depends " + packageToInstall + " | /bin/grep \"^\\w\")";
logger.info("Executing command: \"{}\"", cmd);
Path tempDirectory = null;
try {
repository.setElement(deployArtId, new TArtifactTemplate.Builder(deployArtId.getXmlId().getDecoded(), ToscaBaseTypes.archiveArtifactType).build());
tempDirectory = Files.createTempDirectory(packageDaId.getLocalPart());
ArtifactTemplateFilesDirectoryId filesId = new ArtifactTemplateFilesDirectoryId(deployArtId);
try {
Utils.execute(tempDirectory.toString(), "bash", "-c", cmd);
} catch (IOException | InterruptedException e) {
logger.info("Cannot perform download, skipping it! You must add the DA contents yourself!");
logger.debug("Root cause:", e);
}
// Ensure the folder structure exists.
RepositoryFileReference tarFileRef = new RepositoryFileReference(filesId, generatedPackage);
if (repository.id2AbsolutePath(filesId).toFile().mkdirs()) {
compressFolderContents(tempDirectory.toString(), repository.ref2AbsolutePath(tarFileRef).toString());
BackendUtils.synchronizeReferences(repository, deployArtId);
} else {
logger.error("Could not create folders: {}", repository.id2AbsolutePath(filesId).toFile().getAbsolutePath());
}
} catch (Exception e) {
logger.error("Error while downloading artifacts...", e);
} finally {
if (tempDirectory != null) {
FileUtils.forceDelete(tempDirectory);
}
}
}
generatedArtifacts.deploymentArtifactsToAdd.add(packageDaId);
return generatedPackage;
}
use of org.eclipse.winery.model.ids.definitions.ArtifactTemplateId in project winery by eclipse.
the class ServiceTemplatesResource method createFromArtifact.
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response createFromArtifact(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail, @FormDataParam("file") FormDataBodyPart body, @FormDataParam("artifactType") QName artifactType, @FormDataParam("nodeTypes") List<FormDataBodyPart> nodeTypesList, @FormDataParam("infrastructureNodeType") QName infrastructureNodeType, @FormDataParam("tags") List<FormDataBodyPart> sentTagsList, @Context UriInfo uriInfo) throws IllegalArgumentException, JAXBException, IOException {
Set<String> sentTags = new HashSet<>();
if (sentTagsList != null) {
for (FormDataBodyPart tag : sentTagsList) {
sentTags.add(tag.getValue());
}
}
Set<String> tags = RestUtils.clean(sentTags);
Set<QName> nodeTypes = new HashSet<>();
for (FormDataBodyPart nodetype : nodeTypesList) {
nodeTypes.add(QName.valueOf(nodetype.getValue()));
}
nodeTypes = RestUtils.cleanQNameSet(nodeTypes);
Collection<ServiceTemplateId> xaasPackages = this.getXaaSPackageTemplates(artifactType);
Collection<ServiceTemplateId> toRemove = new ArrayList<>();
// check whether the serviceTemplate contains all the given nodeTypes
for (ServiceTemplateId serviceTemplate : xaasPackages) {
if (!RestUtils.containsNodeTypes(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), nodeTypes) | !RestUtils.containsTags(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), tags)) {
toRemove.add(serviceTemplate);
continue;
}
if (infrastructureNodeType != null && !infrastructureNodeType.getLocalPart().equals("undefined")) {
if (RestUtils.getTagValue(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), "xaasPackageInfrastructure") == null) {
toRemove.add(serviceTemplate);
} else {
String value = RestUtils.getTagValue(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), "xaasPackageInfrastructure");
if (value != null) {
String localName = value.split("}")[1];
String namespace = value.split("}")[0].substring(1);
if (!infrastructureNodeType.equals(new QName(namespace, localName))) {
toRemove.add(serviceTemplate);
}
}
}
}
}
xaasPackages.removeAll(toRemove);
if (xaasPackages.size() <= 0) {
return Response.serverError().entity("No suitable ServiceTemplate found for given artifact and configuration").build();
}
// take the first found serviceTemplate
ServiceTemplateId serviceTemplate = xaasPackages.iterator().next();
// create new name for the cloned sTemplate
String newTemplateName = fileDetail.getFileName() + "ServiceTemplate";
// create artifactTemplate for the uploaded artifact
ArtifactTemplateId artifactTemplateId = RestUtils.createArtifactTemplate(uploadedInputStream, fileDetail, body, artifactType, uriInfo);
// clone serviceTemplate
ServiceTemplateId serviceTemplateId = RestUtils.cloneServiceTemplate(serviceTemplate, newTemplateName, fileDetail.getFileName());
if (RestUtils.hasDA(serviceTemplateId, RestUtils.getTagValue(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), "xaasPackageNode"), RestUtils.getTagValue(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), "xaasPackageDeploymentArtifact"))) {
// inject artifact as DA into cloned ServiceTemplate
BackendUtils.injectArtifactTemplateIntoDeploymentArtifact(serviceTemplateId, RestUtils.getTagValue(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), "xaasPackageNode"), RestUtils.getTagValue(new ServiceTemplateResource(serviceTemplate).getServiceTemplate(), "xaasPackageDeploymentArtifact"), artifactTemplateId, requestRepository);
} else {
return Response.serverError().entity("Tagged DeploymentArtifact could not be found on given specified NodeTemplate").build();
}
URI absUri = RestUtils.getAbsoluteURI(serviceTemplateId);
// http://localhost:8080/winery/servicetemplates/winery/servicetemplates/http%253A%252F%252Fopentosca.org%252Fservicetemplates/hs_err_pid13228.logServiceTemplate/
// http://localhost:8080/winery/servicetemplates/winery/servicetemplates/http%253A%252F%252Fopentosca.org%252Fservicetemplates/java0.logServiceTemplate/
String absUriString = absUri.toString().replace("/winery/servicetemplates", "");
absUri = URI.create(absUriString);
return Response.created(absUri).build();
}
use of org.eclipse.winery.model.ids.definitions.ArtifactTemplateId in project winery by eclipse.
the class VersionSupport method getDefinitionInTheGivenVersion.
public static DefinitionsChildId getDefinitionInTheGivenVersion(DefinitionsChildId childId, WineryVersion otherVersion) {
if (childId.getVersion().compareTo(otherVersion) == 0) {
return childId;
}
String localPart = childId.getNameWithoutVersion() + (otherVersion.toString().length() > 0 ? WineryVersion.WINERY_NAME_FROM_VERSION_SEPARATOR + otherVersion.toString() : "");
QName qName = new QName(childId.getNamespace().getDecoded(), localPart);
if (childId instanceof RelationshipTypeImplementationId) {
return new RelationshipTypeImplementationId(qName);
} else if (childId instanceof NodeTypeImplementationId) {
return new NodeTypeImplementationId(qName);
} else if (childId instanceof RequirementTypeId) {
return new RequirementTypeId(qName);
} else if (childId instanceof NodeTypeId) {
return new NodeTypeId(qName);
} else if (childId instanceof RelationshipTypeId) {
return new RelationshipTypeId(qName);
} else if (childId instanceof CapabilityTypeId) {
return new CapabilityTypeId(qName);
} else if (childId instanceof ArtifactTypeId) {
return new ArtifactTypeId(qName);
} else if (childId instanceof PolicyTypeId) {
return new PolicyTypeId(qName);
} else if (childId instanceof PolicyTemplateId) {
return new PolicyTemplateId(qName);
} else if (childId instanceof ServiceTemplateId) {
return new ServiceTemplateId(qName);
} else if (childId instanceof ArtifactTemplateId) {
return new ArtifactTemplateId(qName);
} else {
throw new IllegalStateException("Unhandled id branch. Could happen for XSDImportId");
}
}
use of org.eclipse.winery.model.ids.definitions.ArtifactTemplateId in project winery by eclipse.
the class NodeTemplateResource method createStateElement.
@POST
@Path("state")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response createStateElement(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail, @FormDataParam("file") FormDataBodyPart body, @Context UriInfo uriInfo) {
LOGGER.debug("Received state artifact for Node Template {} with ID {}", this.nodeTemplate.getName(), this.nodeTemplate.getId());
LOGGER.debug("Artifact file name is {} and is {} bytes big.", fileDetail.getFileName(), fileDetail.getSize());
// ensure that the artifact type exists.
IRepository repo = RepositoryFactory.getRepository();
repo.getElement(new ArtifactTypeId(OpenToscaBaseTypes.stateArtifactType));
// create DA
Optional<TDeploymentArtifact> stateDeploymentArtifact = this.getDeploymentArtifacts().getDeploymentArtifacts().stream().filter(artifact -> artifact.getArtifactType() != null).filter(artifact -> artifact.getArtifactType().equals(OpenToscaBaseTypes.stateArtifactType)).findFirst();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
TDeploymentArtifact deploymentArtifact = new TDeploymentArtifact.Builder("state", OpenToscaBaseTypes.stateArtifactType).build();
String componentVersion = dateFormat.format(new Date());
ArtifactTemplateId newArtifactTemplateId = new ArtifactTemplateId("http://opentosca.org/artifacttemplates", this.getServiceTemplateResource().getServiceTemplate().getName() + "-" + this.nodeTemplate.getId() + "-State" + WineryVersion.WINERY_NAME_FROM_VERSION_SEPARATOR + componentVersion + WineryVersion.WINERY_VERSION_SEPARATOR + WineryVersion.WINERY_VERSION_PREFIX + "1", false);
LOGGER.debug("Created Artifact Template of Type \"State\" called {}", newArtifactTemplateId.getQName());
// if there is already a state artifact, update the file
if (stateDeploymentArtifact.isPresent()) {
LOGGER.debug("Updating the state DA of the Node Template...");
deploymentArtifact = stateDeploymentArtifact.get();
// create new ArtifactTemplate version
ArtifactTemplateId oldArtifactTemplateId = new ArtifactTemplateId(deploymentArtifact.getArtifactRef());
List<WineryVersion> versions = WineryVersionUtils.getAllVersionsOfOneDefinition(oldArtifactTemplateId, repo);
WineryVersion newWineryVersion = VersionUtils.getNewWineryVersion(versions);
newWineryVersion.setWorkInProgressVersion(0);
newWineryVersion.setComponentVersion(componentVersion);
newArtifactTemplateId = (ArtifactTemplateId) VersionSupport.getDefinitionInTheGivenVersion(oldArtifactTemplateId, newWineryVersion);
} else {
LOGGER.debug("Creating the state DA of the Node Template...");
List<TDeploymentArtifact> list = this.nodeTemplate.getDeploymentArtifacts();
if (Objects.isNull(list)) {
list = new ArrayList<>();
this.nodeTemplate.setDeploymentArtifacts(list);
}
list.add(deploymentArtifact);
}
new ArtifactTemplatesResource().onJsonPost(new QNameWithTypeApiData(newArtifactTemplateId.getQName().getLocalPart(), newArtifactTemplateId.getQName().getNamespaceURI(), OpenToscaBaseTypes.stateArtifactType.toString()));
LOGGER.debug("Attaching the new Artifact...");
deploymentArtifact.setArtifactRef(newArtifactTemplateId.getQName());
Response response = new ArtifactTemplateResource(newArtifactTemplateId).getFilesResource().onPost(uploadedInputStream, fileDetail, body, uriInfo, this.nodeTemplate.getId() + ".state");
if (response.getStatus() != Response.Status.CREATED.getStatusCode()) {
LOGGER.debug("Could not create artifact file! Response was {}", response);
return response;
}
LOGGER.debug("Persisting now...");
return RestUtils.persist(this.res);
}
use of org.eclipse.winery.model.ids.definitions.ArtifactTemplateId in project winery by eclipse.
the class YamlRepository method createNewCacheNodeTypeWithArtifact.
/**
* Creates new cache node type and saves artifact until it's referenced
*
* @param ref repository file reference
* @param artifactTemplate new artifact template
* @param artifact yaml artifact
* @param imports imports
* @return new yaml service template
*/
private YTServiceTemplate createNewCacheNodeTypeWithArtifact(RepositoryFileReference ref, TArtifactTemplate artifactTemplate, YTArtifactDefinition artifact, List<YTMapImportDefinition> imports) {
YTServiceTemplate serviceTemplate = createEmptyCacheNodeType(((ArtifactTemplateId) ref.getParent()).getQName().getNamespaceURI());
Map<String, YTArtifactDefinition> artifacts = new LinkedHashMap<>();
artifacts.put(artifactTemplate.getIdFromIdOrNameField(), artifact);
serviceTemplate.getNodeTypes().entrySet().iterator().next().getValue().setArtifacts(artifacts);
serviceTemplate.setImports(imports);
return serviceTemplate;
}
Aggregations