Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,9 @@ export async function addNodeWithArtifactToServiceTemplateByName(
name,
artifactTemplateQName,
artifactName,
artifactTypeQName
artifactTypeQName,
requirementTypes,
kvProperties
) {
const serviceTemplateAddress =
encodeURIComponent(encodeURIComponent(QUANTME_NAMESPACE_PUSH)) +
Expand All @@ -221,7 +223,9 @@ export async function addNodeWithArtifactToServiceTemplateByName(
name,
artifactTemplateQName,
artifactName,
artifactTypeQName
artifactTypeQName,
requirementTypes,
kvProperties
);
return serviceTemplateAddress;
}
Expand Down Expand Up @@ -288,7 +292,9 @@ export async function addNodeWithArtifactToServiceTemplate(
name,
artifactTemplateQName,
artifactName,
artifactTypeQName
artifactTypeQName,
requirementTypes,
kvProperties
) {
const nodeTemplate = {
documentation: [],
Expand All @@ -305,10 +311,7 @@ export async function addNodeWithArtifactToServiceTemplate(
},
properties: {
propertyType: "KV",
kvproperties: {
Port: "",
Name: "",
},
kvproperties: kvProperties,
elementName: "properties",
namespace:
"http://opentosca.org/nodetypes/propertiesdefinition/winery",
Expand All @@ -321,7 +324,7 @@ export async function addNodeWithArtifactToServiceTemplate(
x: 1245,
y: 350,
capabilities: [],
requirements: [],
requirements: requirementTypes,
deploymentArtifacts: [
{
documentation: [],
Expand Down Expand Up @@ -391,16 +394,23 @@ export async function createServiceTemplateWithNodeAndArtifact(
nodeName,
artifactTemplateQName,
artifactName,
artifactTypeQName
artifactTypeQName,
requirementTypes,
kvProperties
) {
const serviceTemplateAddress = await createServiceTemplate(name);
const serviceTemplateAddress = await createServiceTemplate(
name,
"http://quantil.org/quantme/push"
);
await addNodeWithArtifactToServiceTemplate(
serviceTemplateAddress,
nodeTypeQName,
nodeName,
artifactTemplateQName,
artifactName,
artifactTypeQName
artifactTypeQName,
requirementTypes,
kvProperties
);
return serviceTemplateAddress;
}
Expand Down Expand Up @@ -436,10 +446,41 @@ const nodeTypeQNameMapping = new Map([
"{http://opentosca.org/nodetypes}PythonApp_3-w1",
],
]);

const artifactTypeKVMapping = new Map([
[
"WAR",
{
Port: "",
Name: "",
},
],
[
"Python",
{
Port: "",
Name: "",
},
],
[
"Flask",
{
StartupCommand:
"export FLASK_APP=app.py && export FLASK_ENV=development && export FLASK_DEBUG=0 && python3 -m flask run --host=0.0.0.0",
Name: "app",
},
],
]);

export function getNodeTypeQName(artifactTypeQName) {
return nodeTypeQNameMapping.get(artifactTypeQName);
}

export function getArtifactTypeKVMapping(artifactType) {
console.log("retrieving kv mapping for type", artifactType);
return artifactTypeKVMapping.get(artifactType);
}

export async function loadTopology(deploymentModelUrl) {
if (deploymentModelUrl.startsWith("{{ wineryEndpoint }}")) {
deploymentModelUrl = deploymentModelUrl.replace(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
createArtifactTemplateWithFile,
createServiceTemplateWithNodeAndArtifact,
getNodeTypeQName,
getArtifactTypeKVMapping,
getArtifactTemplateInfo,
insertTopNodeTag,
serviceTemplateExists,
Expand Down Expand Up @@ -54,6 +55,9 @@ export default function ArtifactUploadModal({
const [selectedOption, setSelectedOption] = useState("");
const [selectedOptionName, setSelectedOptionName] = useState("");
const [artifactTypes, setArtifactTypes] = useState([]);
const [requirementTypes, setRequirementTypes] = useState([]);
const [kvProperties, setKvProperties] = useState({});
const [isFlask, setIsFlask] = useState(false);
const [acceptTypes, setAcceptTypes] = useState("");

async function updateArtifactSelect() {
Expand Down Expand Up @@ -101,9 +105,22 @@ export default function ArtifactUploadModal({
artifactTemplateAddress
);
const artifactTemplateQName =
"{" +
artifactTemplateInfo.targetNamespace +
"}" +
artifactTemplateInfo
.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].type;
const nodeTypeQName = getNodeTypeQName(selectedOption);
.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].id;
// artifactTemplateInfo.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].type;
let nodeTypeQName = getNodeTypeQName(selectedOption);
if (
isFlask &&
nodeTypeQName === "{http://opentosca.org/nodetypes}PythonApp_3-w1"
) {
nodeTypeQName =
"{https://ust-quantil.github.io/nodetypes}QuokkaPythonApp_latest-w1-wip1";
}
console.log("nodetypeqname", nodeTypeQName);
console.log("kvproperties", kvProperties);
const serviceTemplateName = `${namePrefix}ServiceTemplate-${element.id}`;
const doesExist = await serviceTemplateExists(serviceTemplateName);
console.log("doesExist", doesExist);
Expand All @@ -115,7 +132,9 @@ export default function ArtifactUploadModal({
`${namePrefix}Node-${element.id}`,
artifactTemplateQName,
`${namePrefix}Artifact-${element.id}`,
selectedOption
selectedOption,
requirementTypes,
kvProperties
);
await deleteTopNodeTag(serviceTemplateAddress);
} else {
Expand All @@ -125,7 +144,9 @@ export default function ArtifactUploadModal({
`${namePrefix}Node-${element.id}`,
artifactTemplateQName,
`${namePrefix}Artifact-${element.id}`,
selectedOption
selectedOption,
requirementTypes,
kvProperties
);
}
await insertTopNodeTag(serviceTemplateAddress, nodeTypeQName);
Expand Down Expand Up @@ -192,12 +213,36 @@ export default function ArtifactUploadModal({
setSelectedOptionName(artifactTypes.find((x) => x.qName === value).name);
if (value.includes("WAR")) {
setAcceptTypes(allowedFileTypes.war);
setRequirementTypes([]);
setKvProperties(getArtifactTypeKVMapping("WAR"));
} else if (value.includes("PythonArchive")) {
setAcceptTypes(allowedFileTypes.zip);
const pythonReq = {
name: "canHostPythonApp",
id: "req1",
type: "{https://ust-quantil.github.io/requirementtypes}ReqCanInstallQiskit",
};
setRequirementTypes([pythonReq]);
setKvProperties(getArtifactTypeKVMapping("Python"));
}
console.log("handle dropdown change");
};

const isOptionSelected = selectedOption !== "";
const isPythonArchive = selectedOption.includes("PythonArchive");

const handleIsFlaskCheckboxChange = () => {
setIsFlask(!isFlask);
let artifactType = "";
if (isFlask) {
// For some reason this works the other way round as expected
artifactType = "Python";
} else {
artifactType = "Flask";
}
console.log("artifacttype", artifactType);
setKvProperties(getArtifactTypeKVMapping(artifactType));
};

if (artifactTypes.length === 0) {
updateArtifactSelect();
Expand Down Expand Up @@ -252,6 +297,20 @@ export default function ArtifactUploadModal({
))}
</select>
</div>

{isOptionSelected && isPythonArchive && (
<div className="set-flask">
<div>
<label htmlFor="flaskCheckbox">Run as Flask App</label>
<input
type="checkbox"
id="flaskCheckbox"
onChange={handleIsFlaskCheckboxChange}
checked={isFlask}
/>
</div>
</div>
)}
{isOptionSelected && (
<div className="upload-file-upload">
<div>
Expand Down
Loading