Commit a9cb2403 authored by Spiros Koulouzis's avatar Spiros Koulouzis

move plan creation to provisioner

parent 2bcce877
......@@ -106,6 +106,9 @@ node_types:
os:
type: string
required: true
ssh_key:
type: string
required: false
interfaces:
Standard:
create: dumy.yaml
......@@ -134,7 +137,10 @@ node_types:
required: true
domain:
type: string
required: true
required: true
credential:
type: tosca.datatypes.Credential
required: false
interfaces:
Standard:
create: dumy.yaml
......
......@@ -95,34 +95,19 @@ public class PlannerService {
for (MessageParameter mp : messageParams) {
String value = mp.getValue();
toscaPlan = new String(Base64.getDecoder().decode(value));
logger.log(Level.INFO, "TOSCA Plann: "+toscaPlan);
}
// String domainName = getBestDomain(cloudProvider);
SimplePlanContainer simplePlan = P2PConverter.transfer(toscaPlan, null, null, null);
logger.log(Level.INFO, "TOSCA Plann: " + toscaPlan);
PlanResponse topLevel = new PlanResponse();
topLevel.setLevel(0);
topLevel.setToscaID(toscaId);
topLevel.setName("planner_output_all.yml");
topLevel.setKvMap(Converter.ymlString2Map(simplePlan.topLevelContents));
Map<String, String> map = simplePlan.lowerLevelContents;
Set<String> loweLevelPlansIDs = new HashSet<>();
for (String lowLevelNames : map.keySet()) {
PlanResponse lowLevelPlan = new PlanResponse();
lowLevelPlan.setLevel(1);
lowLevelPlan.setToscaID(toscaId);
lowLevelPlan.setName(lowLevelNames);
lowLevelPlan.setKvMap(Converter.ymlString2Map(map.get(lowLevelNames)));
save(lowLevelPlan);
loweLevelPlansIDs.add(lowLevelPlan.getId());
}
Map<String, Object> toscaPlanMap = Converter.ymlString2Map(toscaPlan);
// SimplePlanContainer simplePlan = P2PConverter.transfer(toscaPlanMap, null, null, null);
PlanResponse planResponse = new PlanResponse();
planResponse.setToscaID(toscaId);
planResponse.setKvMap(toscaPlanMap);
topLevel.setLoweLevelPlansIDs(loweLevelPlansIDs);
save(topLevel);
save(planResponse);
logger.log(Level.INFO, "Plan saved");
return topLevel;
return planResponse;
}
}
......@@ -167,16 +152,6 @@ public class PlannerService {
}
Map<String, Object> map = plan.getKeyValue();
Set<String> ids = plan.getLoweLevelPlanIDs();
if (ids != null) {
for (String lowID : ids) {
PlanResponse ll = findOne(lowID);
Map<String, Object> lowLevelMap = ll.getKeyValue();
if (lowLevelMap != null) {
map.put(ll.getName(), lowLevelMap);
}
}
}
if (fromat != null && fromat.equals("yml")) {
String ymlStr = Converter.map2YmlString(map);
......@@ -200,13 +175,7 @@ public class PlannerService {
@PostFilter("(filterObject.owner == authentication.name) or (hasRole('ROLE_ADMIN'))")
public List<PlanResponse> findAll() {
List<PlanResponse> all = planDao.findAll();
List<PlanResponse> topLevel = new ArrayList<>();
for (PlanResponse p : all) {
if (p.getLevel() == 0) {
topLevel.add(p);
}
}
return topLevel;
return all;
}
public PlanResponse save(PlanResponse ownedObject) {
......@@ -251,8 +220,6 @@ public class PlannerService {
Map<String, Object> map = Converter.cleanStringContents(ymlContents, true);
PlanResponse pr = new PlanResponse();
pr.setKvMap(map);
pr.setLevel(level);
pr.setName(name);
save(pr);
return pr.getId();
}
......@@ -283,7 +250,6 @@ public class PlannerService {
// List<CloudCredentials> creds = credentialService.findAll();
// return creds.get(0).getCloudProviderName().toUpperCase();
// }
// private String getBestDomain(String cloudProvider) {
// switch (cloudProvider.trim().toLowerCase()) {
// case "ec2":
......@@ -295,5 +261,4 @@ public class PlannerService {
// }
// return null;
// }
}
......@@ -63,6 +63,7 @@ import nl.uva.sne.drip.commons.utils.DRIPLogHandler;
import nl.uva.sne.drip.drip.commons.data.v1.external.Key;
import nl.uva.sne.drip.drip.commons.data.v1.external.KeyPair;
import nl.uva.sne.drip.drip.commons.data.v1.external.ScaleRequest;
import org.apache.commons.codec.binary.Base64;
/**
*
......@@ -133,61 +134,38 @@ public class ProvisionService {
}
public ProvisionResponse provisionResources(ProvisionRequest provisionRequest, int provisionerVersion) throws IOException, TimeoutException, JSONException, InterruptedException, Exception {
switch (provisionerVersion) {
case 0:
return callProvisioner0(provisionRequest);
case 1:
return callProvisioner1(provisionRequest);
}
return null;
}
private Message buildProvisioner0Message(ProvisionRequest pReq) throws JSONException, IOException {
Message invokationMessage = new Message();
List<MessageParameter> parameters = new ArrayList();
CloudCredentials cred = cloudCredentialsService.findOne(pReq.getCloudCredentialsIDs().get(0));
if (cred == null) {
throw new CloudCredentialsNotFoundException();
}
MessageParameter conf = buildCloudCredentialParam(cred, 0).get(0);
parameters.add(conf);
List<MessageParameter> certs = buildCertificatesParam(cred);
parameters.addAll(certs);
List<MessageParameter> topologies = buildTopologyParams(pReq.getPlanID());
parameters.addAll(topologies);
List<String> userKeyIDs = pReq.getUserKeyPairIDs();
if (userKeyIDs != null) {
List<MessageParameter> userKeys = buildUserKeysParams(userKeyIDs.get(0), 0);
parameters.addAll(userKeys);
}
invokationMessage.setParameters(parameters);
invokationMessage.setCreationDate((System.currentTimeMillis()));
return invokationMessage;
return callProvisioner1(provisionRequest);
}
// private Message buildProvisioner0Message(ProvisionRequest pReq) throws JSONException, IOException {
// Message invokationMessage = new Message();
// List<MessageParameter> parameters = new ArrayList();
// CloudCredentials cred = cloudCredentialsService.findOne(pReq.getCloudCredentialsIDs().get(0));
// if (cred == null) {
// throw new CloudCredentialsNotFoundException();
// }
// MessageParameter conf = buildCloudCredentialParam(cred, 0).get(0);
// parameters.add(conf);
//
// List<MessageParameter> certs = buildCertificatesParam(cred);
// parameters.addAll(certs);
//
// List<MessageParameter> topologies = buildTopologyParams(pReq.getPlanID());
// parameters.addAll(topologies);
//
// List<String> userKeyIDs = pReq.getUserKeyPairIDs();
// if (userKeyIDs != null) {
// List<MessageParameter> userKeys = buildUserKeysParams(userKeyIDs.get(0), 0);
// parameters.addAll(userKeys);
// }
//
// invokationMessage.setParameters(parameters);
// invokationMessage.setCreationDate((System.currentTimeMillis()));
// return invokationMessage;
// }
private List<MessageParameter> buildCloudCredentialParam(CloudCredentials cred, int version) throws JsonProcessingException, JSONException, IOException {
List<MessageParameter> cloudCredentialParams = new ArrayList<>();
if (version == 0) {
MessageParameter cloudCredentialParam = new MessageParameter();
String provider = cred.getCloudProviderName();
if (provider == null) {
throw new BadRequestException("Provider name can't be null. Check the cloud credentials: " + cred.getId());
}
switch (cred.getCloudProviderName().toLowerCase()) {
case "ec2":
cloudCredentialParam = buildEC2Conf(cred);
break;
}
cloudCredentialParams.add(cloudCredentialParam);
return cloudCredentialParams;
}
if (version == 1) {
MessageParameter cloudCred = new MessageParameter();
cloudCred.setName("cloud_credential");
cloudCred.setEncoding("UTF-8");
......@@ -209,38 +187,37 @@ public class ProvisionService {
cloudCredentialParams.add(cloudCred);
return cloudCredentialParams;
}
return null;
}
private List<MessageParameter> buildCertificatesParam(CloudCredentials cred) {
// List<String> loginKeysIDs = cred.getkeyPairIDs();
List<KeyPair> loginKeys = new ArrayList<>();
// for (String keyID : loginKeysIDs) {
// KeyPair key = keyDao.findOne(keyID);
// loginKeys.add(key);
// private List<MessageParameter> buildCertificatesParam(CloudCredentials cred) {
//// List<String> loginKeysIDs = cred.getkeyPairIDs();
// List<KeyPair> loginKeys = new ArrayList<>();
//// for (String keyID : loginKeysIDs) {
//// KeyPair key = keyDao.findOne(keyID);
//// loginKeys.add(key);
//// }
// if (loginKeys.isEmpty()) {
// throw new BadRequestException("Log in keys can't be empty");
// }
if (loginKeys.isEmpty()) {
throw new BadRequestException("Log in keys can't be empty");
}
List<MessageParameter> parameters = new ArrayList<>();
for (KeyPair lk : loginKeys) {
String domainName = lk.getPrivateKey().getAttributes().get("domain_name");
if (domainName == null) {
domainName = lk.getPrivateKey().getAttributes().get("domain_name ");
}
MessageParameter cert = new MessageParameter();
cert.setName("certificate");
cert.setValue(lk.getPrivateKey().getKey());
Map<String, String> attributes = new HashMap<>();
attributes.put("filename", domainName);
cert.setAttributes(attributes);
parameters.add(cert);
}
return parameters;
}
// List<MessageParameter> parameters = new ArrayList<>();
// for (KeyPair lk : loginKeys) {
// String domainName = lk.getPrivateKey().getAttributes().get("domain_name");
// if (domainName == null) {
// domainName = lk.getPrivateKey().getAttributes().get("domain_name ");
// }
// MessageParameter cert = new MessageParameter();
// cert.setName("certificate");
// cert.setValue(lk.getPrivateKey().getKey());
// Map<String, String> attributes = new HashMap<>();
// attributes.put("filename", domainName);
// cert.setAttributes(attributes);
// parameters.add(cert);
// }
// return parameters;
// }
private List<MessageParameter> buildTopologyParams(String planID) throws JSONException, FileNotFoundException {
PlanResponse plan = simplePlanService.getDao().findOne(planID);
......@@ -252,29 +229,30 @@ public class ProvisionService {
topology.setName("topology");
String val = Converter.map2YmlString(plan.getKeyValue());
val = val.replaceAll("\\uff0E", ".");
topology.setValue(val);
String encodedValue = new String(Base64.encodeBase64(val.getBytes()));
topology.setValue(encodedValue);
Map<String, String> attributes = new HashMap<>();
attributes.put("level", String.valueOf(plan.getLevel()));
attributes.put("filename", FilenameUtils.removeExtension(plan.getName()));
// attributes.put("level", String.valueOf(plan.getLevel()));
// attributes.put("filename", FilenameUtils.removeExtension(plan.getName()));
topology.setAttributes(attributes);
parameters.add(topology);
Set<String> ids = plan.getLoweLevelPlanIDs();
if (ids != null) {
for (String lowID : ids) {
PlanResponse lowPlan = simplePlanService.getDao().findOne(lowID);
topology = new MessageParameter();
topology.setName("topology");
String value = Converter.map2YmlString(lowPlan.getKeyValue());
value = value.replaceAll("\\uff0E", ".");
topology.setValue(value);
attributes = new HashMap<>();
attributes.put("level", String.valueOf(lowPlan.getLevel()));
attributes.put("filename", FilenameUtils.removeExtension(lowPlan.getName()));
topology.setAttributes(attributes);
parameters.add(topology);
}
}
// Set<String> ids = plan.getLoweLevelPlanIDs();
// if (ids != null) {
// for (String lowID : ids) {
// PlanResponse lowPlan = simplePlanService.getDao().findOne(lowID);
// topology = new MessageParameter();
// topology.setName("topology");
// String value = Converter.map2YmlString(lowPlan.getKeyValue());
// value = value.replaceAll("\\uff0E", ".");
// topology.setValue(value);
// attributes = new HashMap<>();
//// attributes.put("level", String.valueOf(lowPlan.getLevel()));
//// attributes.put("filename", FilenameUtils.removeExtension(lowPlan.getName()));
// topology.setAttributes(attributes);
// parameters.add(topology);
// }
// }
return parameters;
}
......@@ -408,20 +386,19 @@ public class ProvisionService {
}
private List<MessageParameter> buildScriptParams(String userScriptID) {
Script script = userScriptService.findOne(userScriptID);
if (script == null) {
throw new BadRequestException("User script: " + userScriptID + " was not found");
}
List<MessageParameter> parameters = new ArrayList();
MessageParameter scriptParameter = new MessageParameter();
scriptParameter.setName("guiscript");
scriptParameter.setValue(script.getContents());
scriptParameter.setEncoding("UTF-8");
parameters.add(scriptParameter);
return parameters;
}
// private List<MessageParameter> buildScriptParams(String userScriptID) {
// Script script = userScriptService.findOne(userScriptID);
// if (script == null) {
// throw new BadRequestException("User script: " + userScriptID + " was not found");
// }
// List<MessageParameter> parameters = new ArrayList();
// MessageParameter scriptParameter = new MessageParameter();
// scriptParameter.setName("guiscript");
// scriptParameter.setValue(script.getContents());
// scriptParameter.setEncoding("UTF-8");
// parameters.add(scriptParameter);
// return parameters;
// }
private List<MessageParameter> buildUserKeysParams(String userKeyID, int version) {
KeyPair key = keyPairService.findOne(userKeyID);
if (key == null) {
......@@ -446,17 +423,16 @@ public class ProvisionService {
provisionDao.deleteAll();
}
private ProvisionResponse callProvisioner0(ProvisionRequest provisionRequest) throws IOException, TimeoutException, JSONException, InterruptedException, Exception {
try (DRIPCaller provisioner = new ProvisionerCaller0(messageBrokerHost);) {
Message provisionerInvokationMessage = buildProvisioner0Message(provisionRequest);
provisionerInvokationMessage.setOwner(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername());
logger.info("Calling provisioner");
Message response = (provisioner.call(provisionerInvokationMessage));
logger.info("Got provisioner response");
return parseCreateResourcesResponse(response.getParameters(), provisionRequest, null, true, true);
}
}
// private ProvisionResponse callProvisioner0(ProvisionRequest provisionRequest) throws IOException, TimeoutException, JSONException, InterruptedException, Exception {
// try (DRIPCaller provisioner = new ProvisionerCaller0(messageBrokerHost);) {
// Message provisionerInvokationMessage = buildProvisioner0Message(provisionRequest);
// provisionerInvokationMessage.setOwner(((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername());
// logger.info("Calling provisioner");
// Message response = (provisioner.call(provisionerInvokationMessage));
// logger.info("Got provisioner response");
// return parseCreateResourcesResponse(response.getParameters(), provisionRequest, null, true, true);
// }
// }
private ProvisionResponse callProvisioner1(ProvisionRequest provisionRequest) throws IOException, TimeoutException, JSONException, InterruptedException, Exception {
try (DRIPCaller provisioner = new ProvisionerCaller1(messageBrokerHost);) {
Message provisionerInvokationMessage = buildProvisioner1Message(provisionRequest);
......
......@@ -78,14 +78,14 @@ public class SimplePlannerService {
String originalFileName = p.getName();
String name = System.currentTimeMillis() + "_" + originalFileName;
if (originalFileName.equals("planner_output_all.yml")) {
topLevel.setName(name);
topLevel.setLevel(0);
// topLevel.setName(name);
// topLevel.setLevel(0);
topLevel.setKvMap(Converter.ymlString2Map(p.getValue()));
} else {
lowerLevelPlan = new PlanResponse();
lowerLevelPlan.setName(name);
// lowerLevelPlan.setName(name);
lowerLevelPlan.setKvMap(Converter.ymlString2Map(p.getValue()));
lowerLevelPlan.setLevel(1);
// lowerLevelPlan.setLevel(1);
planDao.save(lowerLevelPlan);
ids.add(lowerLevelPlan.getId());
}
......@@ -166,12 +166,12 @@ public class SimplePlannerService {
public List<PlanResponse> findAll() {
List<PlanResponse> all = planDao.findAll();
List<PlanResponse> topLevel = new ArrayList<>();
for (PlanResponse p : all) {
if (p.getLevel() == 0) {
topLevel.add(p);
}
}
return topLevel;
// List<PlanResponse> topLevel = new ArrayList<>();
// for (PlanResponse p : all) {
// if (p.getLevel() == 0) {
// topLevel.add(p);
// }
// }
return all;
}
}
/*
* Copyright 2017 S. Koulouzis.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.api.v0.rest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.security.RolesAllowed;
import nl.uva.sne.drip.api.exception.KeyException;
import nl.uva.sne.drip.drip.commons.data.v1.external.CloudCredentials;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import nl.uva.sne.drip.api.exception.NullKeyException;
import nl.uva.sne.drip.api.exception.NullKeyIDException;
import nl.uva.sne.drip.api.service.CloudCredentialsService;
import nl.uva.sne.drip.api.service.KeyPairService;
import nl.uva.sne.drip.api.service.UserService;
import nl.uva.sne.drip.drip.commons.data.v0.external.Configure;
import nl.uva.sne.drip.drip.commons.data.v1.external.Key;
import nl.uva.sne.drip.drip.commons.data.v1.external.KeyPair;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
/**
*
* This controller is responsible for handling cloud credentials used by the
* provisoner to request for resources (VMs).
*
* @author S. Koulouzis
*/
@RestController
@RequestMapping("/user/v0.0/switch/account/configure")
@Component
@Deprecated
public class CloudConfigurationController0 {
@Autowired
private CloudCredentialsService cloudCredentialsService;
@Autowired
private KeyPairService keyService;
@RequestMapping(value = "/ec2", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
String postEC2Conf(@RequestBody Configure configure) throws Exception {
if (configure.key == null) {
throw new NullKeyException();
}
if (configure.keyid == null) {
throw new NullKeyIDException();
}
CloudCredentials cloudCredentials = new CloudCredentials();
cloudCredentials.setAccessKeyId(configure.keyid);
cloudCredentials.setSecretKey(configure.key);
List<String> loginKeyIDs = new ArrayList<>();
for (nl.uva.sne.drip.drip.commons.data.v0.external.LoginKey0 key0 : configure.loginKey) {
try {
nl.uva.sne.drip.drip.commons.data.v1.external.Key key1 = new nl.uva.sne.drip.drip.commons.data.v1.external.Key();
KeyPair pair = new KeyPair();
key1.setKey(key0.content);
Map<String, String> attributes = new HashMap<>();
attributes.put("domain_name", key0.domain_name);
key1.setAttributes(attributes);
pair.setPrivateKey(key1);
pair = keyService.save(pair);
loginKeyIDs.add(pair.getId());
} catch (KeyException ex) {
Logger.getLogger(CloudConfigurationController0.class.getName()).log(Level.SEVERE, null, ex);
}
}
// cloudCredentials.setKeyIDs(loginKeyIDs);
cloudCredentials.setCloudProviderName("ec2");
cloudCredentials = cloudCredentialsService.save(cloudCredentials);
return "Success: " + cloudCredentials.getId();
}
@RequestMapping(value = "/geni", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
String postGeniConf(@RequestBody Configure configure) throws Exception {
if (configure.geniKey == null) {
throw new NullKeyException();
}
if (configure.geniKeyAlias == null) {
throw new NullKeyIDException();
}
CloudCredentials cloudCredentials = new CloudCredentials();
// cloudCredentials.setKeyIdAlias(configure.geniKeyAlias);
cloudCredentials.setAccessKeyId(configure.geniKey);
cloudCredentials.setSecretKey(configure.geniKeyPass);
List<String> loginKeyIDs = new ArrayList<>();
for (nl.uva.sne.drip.drip.commons.data.v0.external.LoginKey0 key0 : configure.loginPubKey) {
try {
nl.uva.sne.drip.drip.commons.data.v1.external.Key key1 = new nl.uva.sne.drip.drip.commons.data.v1.external.Key();
key1.setKey(key0.content);
key1.setType(Key.KeyType.PUBLIC);
KeyPair pair = new KeyPair();
pair.setPublicKey(key1);
pair = keyService.save(pair);
loginKeyIDs.add(pair.getId());
} catch (KeyException ex) {
Logger.getLogger(CloudConfigurationController0.class.getName()).log(Level.SEVERE, null, ex);
}
}
for (nl.uva.sne.drip.drip.commons.data.v0.external.LoginKey0 key0 : configure.loginPriKey) {
try {
nl.uva.sne.drip.drip.commons.data.v1.external.Key key1 = new nl.uva.sne.drip.drip.commons.data.v1.external.Key();
key1.setKey(key0.content);
key1.setType(Key.KeyType.PRIVATE);
KeyPair pair = new KeyPair();
pair.setPrivateKey(key1);
pair = keyService.save(pair);
loginKeyIDs.add(pair.getId());
} catch (KeyException ex) {
Logger.getLogger(CloudConfigurationController0.class.getName()).log(Level.SEVERE, null, ex);
}
}
// cloudCredentials.setKeyIDs(loginKeyIDs);
cloudCredentials.setCloudProviderName("geni");
cloudCredentialsService.save(cloudCredentials);
return "Success: " + cloudCredentials.getId();
}
}
/*
* Copyright 2017 S. Koulouzis, Wang Junchao, Huan Zhou, Yang Hu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.api.v0.rest;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.security.RolesAllowed;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import nl.uva.sne.drip.api.service.DeployService;
import nl.uva.sne.drip.api.service.UserService;
import nl.uva.sne.drip.drip.commons.data.v0.external.Deploy;
import nl.uva.sne.drip.drip.commons.data.v0.external.Attribute;
import nl.uva.sne.drip.drip.commons.data.v0.external.Result;
import nl.uva.sne.drip.drip.commons.data.v1.external.DeployRequest;
import nl.uva.sne.drip.drip.commons.data.v1.external.DeployResponse;
import nl.uva.sne.drip.drip.commons.data.v1.external.Key;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
/**
* This controller is responsible for deploying a cluster on provisioned
* resources.
*
* @author S. Koulouzis
*/
@RestController
@RequestMapping("/user/v0.0/switch/deploy")
@Component
@PreAuthorize("isAuthenticated()")
@Deprecated
public class DeployController0 {
@Autowired
private DeployService deployService;
@RequestMapping(value = "/kubernetes", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE, produces = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
Result deployKubernetes(@RequestBody Deploy deploy) {
try {
DeployRequest deployReq = new DeployRequest();
deployReq.setManagerType("kubernetes");
deployReq.setProvisionID(deploy.action);
return deploy(deployReq);
} catch (Exception ex) {
Logger.getLogger(DeployController0.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
@RequestMapping(value = "/swarm", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE, produces = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
Result deploySwarm(@RequestBody Deploy deploy) {
try {
DeployRequest deployReq = new DeployRequest();
deployReq.setManagerType("swarm");
deployReq.setProvisionID(deploy.action);
return deploy(deployReq);
} catch (Exception ex) {
Logger.getLogger(DeployController0.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
private Result deploy(DeployRequest deployReq) throws Exception {
DeployResponse key = deployService.deploySoftware(deployReq);
Result res = new Result();
res.info = "INFO";
res.status = "Success";
List<Attribute> files = new ArrayList<>();
Attribute attribute = new Attribute();
attribute.content = key.getKeyPair().getPrivateKey().getKey();
files.add(attribute);
res.file = files;
return res;
}
}
/*
* Copyright 2017 S. Koulouzis, Wang Junchao, Huan Zhou, Yang Hu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.api.v0.rest;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import nl.uva.sne.drip.drip.commons.data.v0.external.Result;
import javax.annotation.security.RolesAllowed;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import nl.uva.sne.drip.api.service.PlannerService;
import nl.uva.sne.drip.api.service.ToscaService;
import nl.uva.sne.drip.api.service.UserService;
import nl.uva.sne.drip.commons.utils.Converter;
import nl.uva.sne.drip.drip.commons.data.v0.external.Attribute;
import nl.uva.sne.drip.drip.commons.data.v0.external.Plan;
import org.json.JSONException;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
/**
* This controller is responsible for planning the type of resources to be
* provisioned based on a TOSCA description.
*
* @author S. Koulouzis
*/
@RestController
@RequestMapping("/user/v0.0/switch/plan")
@Component
@Deprecated
public class PlannerController0 {
@Autowired
private PlannerService plannerService;
@Autowired
private ToscaService toscaService;
@RequestMapping(value = "/planning", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE, produces = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
Result plan(@RequestBody Plan plan0) {
try {
String yaml = plan0.file;
yaml = yaml.replaceAll("\\\\n", "\n");
String id = toscaService.saveYamlString(yaml, null);
nl.uva.sne.drip.drip.commons.data.v1.external.PlanResponse plan1 = plannerService.getPlan(id, null,-1);
Result r = new Result();
r.info = ("INFO");
r.status = ("Success");
List<Attribute> files = new ArrayList<>();
Attribute e = Converter.plan1toFile(plan1);
files.add(e);
for (String lowiID : plan1.getLoweLevelPlanIDs()) {
nl.uva.sne.drip.drip.commons.data.v1.external.PlanResponse lowPlan1 = plannerService.findOne(lowiID);
e = Converter.plan1toFile(lowPlan1);
files.add(e);
//Don't save them cause they will be re-uploaded in the provision step
plannerService.delete(lowPlan1.getId());
}
r.file = files;
plannerService.delete(plan1.getId());
return r;
} catch (IOException | JSONException | TimeoutException | InterruptedException ex) {
Logger.getLogger(PlannerController0.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
/*
* Copyright 2017 S. Koulouzis, Wang Junchao, Huan Zhou, Yang Hu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.api.v0.rest;
import java.io.IOException;
import nl.uva.sne.drip.drip.commons.data.v1.external.ProvisionRequest;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.security.RolesAllowed;
import nl.uva.sne.drip.commons.utils.Converter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import nl.uva.sne.drip.api.service.CloudCredentialsService;
import nl.uva.sne.drip.api.service.PlannerService;
import nl.uva.sne.drip.api.service.ProvisionService;
import nl.uva.sne.drip.api.service.KeyPairService;
import nl.uva.sne.drip.api.service.ScriptService;
import nl.uva.sne.drip.api.service.UserService;
import nl.uva.sne.drip.drip.commons.data.v0.external.Execute;
import nl.uva.sne.drip.drip.commons.data.v0.external.Attribute;
import nl.uva.sne.drip.drip.commons.data.v0.external.Result;
import nl.uva.sne.drip.drip.commons.data.v0.external.Upload;
import nl.uva.sne.drip.drip.commons.data.v1.external.CloudCredentials;
import nl.uva.sne.drip.drip.commons.data.v1.external.KeyPair;
import nl.uva.sne.drip.drip.commons.data.v1.external.ProvisionResponse;
import org.json.JSONException;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestBody;
/**
* This controller is responsible for obtaining resources from cloud providers
* based the plan generated by the planner and uploaded by the user
*
* @author S. Koulouzis
*/
@RestController
@RequestMapping("/user/v0.0/switch/provision")
@Component
@PreAuthorize("isAuthenticated()")
@Deprecated
public class ProvisionController0 {
@Autowired
private ScriptService userScriptService;
@Autowired
private KeyPairService userKeysService;
@Autowired
private CloudCredentialsService cloudCredentialsService;
@Autowired
private ProvisionService provisionService;
@Autowired
private PlannerService planService;
@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
String provision(@RequestBody Upload upload) {
ProvisionResponse resp = new ProvisionResponse();
CloudCredentials cloudCred = cloudCredentialsService.findAll().get(0);
String cloudCredID = cloudCred.getId();
List<String> idList = new ArrayList<>();
idList.add(cloudCredID);
resp.setCloudCredentialsIDs(idList);
List<nl.uva.sne.drip.drip.commons.data.v0.external.Attribute> plans = upload.file;
nl.uva.sne.drip.drip.commons.data.v1.external.PlanResponse topLevelPlan = null;
Set<String> loweLevelPlansIDs = new HashSet<>();
for (nl.uva.sne.drip.drip.commons.data.v0.external.Attribute p : plans) {
nl.uva.sne.drip.drip.commons.data.v1.external.PlanResponse plan1 = Converter.File2Plan1(p);
if (plan1.getLevel() == 0) {
topLevelPlan = plan1;
} else {
plan1 = planService.save(plan1);
loweLevelPlansIDs.add(plan1.getId());
}
}
topLevelPlan.setLoweLevelPlansIDs(loweLevelPlansIDs);
topLevelPlan = planService.save(topLevelPlan);
String planID = topLevelPlan.getId();
resp.setPlanID(planID);
List<KeyPair> allKeys = userKeysService.findAll();
List<String> keyPairIDs = new ArrayList<>();
if (allKeys != null && !allKeys.isEmpty()) {
for (KeyPair keyPair : allKeys) {
String userKeyID = keyPair.getId();
keyPairIDs.add(userKeyID);
}
resp.setUserKeyPairIDs(keyPairIDs);
}
resp = provisionService.save(resp);
return "Success: Infrastructure files are uploaded! Action number: "
+ resp.getId();
}
@RequestMapping(value = "/execute", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE, produces = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
Result execute(@RequestBody Execute exc) {
try {
ProvisionRequest req = provisionService.findOne(exc.action);
req = provisionService.provisionResources(req,0);
Map<String, Object> map = req.getKeyValue();
String yaml = Converter.map2YmlString(map);
yaml = yaml.replaceAll("\n", "\\\\n");
Result res = new Result();
List<Attribute> files = new ArrayList<>();
Attribute e = new Attribute();
e.content = yaml;
e.level = "0";
e.name = "provisioned_" + exc.action;
files.add(e);
res.info = "INFO";
res.status = "Success";
res.file = files;
return res;
} catch (IOException | TimeoutException | JSONException | InterruptedException ex) {
Logger.getLogger(ProvisionController0.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(ProvisionController0.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
/*
* Copyright 2017 S. Koulouzis, Wang Junchao, Huan Zhou, Yang Hu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.api.v0.rest;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.security.RolesAllowed;
import nl.uva.sne.drip.api.exception.PasswordNullException;
import nl.uva.sne.drip.api.exception.UserExistsException;
import nl.uva.sne.drip.api.exception.UserNullException;
import nl.uva.sne.drip.drip.commons.data.v1.external.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import nl.uva.sne.drip.api.service.UserService;
import nl.uva.sne.drip.drip.commons.data.v0.external.Register;
import org.springframework.http.MediaType;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.RequestBody;
/**
* This controller is responsible for handling user accounts
*
* @author S. Koulouzis
*/
@RestController
@RequestMapping("/manager/v0.0/switch/account")
@Component
@Deprecated
public class UserController0 {
@Autowired
private UserService service;
@RequestMapping(value = "/register", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.ADMIN})
public @ResponseBody
String register(@RequestBody Register register) {
if (register.user == null) {
throw new UserNullException();
}
if (register.pwd == null) {
throw new PasswordNullException();
}
UserDetails registeredUser = service.loadUserByUsername(register.user);
if (registeredUser != null) {
throw new UserExistsException("Username " + register.user + " is used");
}
User user = new User();
user.setUsername(register.user);
user.setAccountNonExpired(true);
user.setAccountNonLocked(true);
user.setEnabled(true);
user.setCredentialsNonExpired(true);
Collection<String> roles = new ArrayList<>();
roles.add("USER");
user.setRoles(roles);
user.setPassword(new BCryptPasswordEncoder().encode(register.pwd));
user = service.save(user);
return "Success: " + user.getId();
}
}
/*
* Copyright 2017 S. Koulouzis.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.api.v0.rest;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.security.RolesAllowed;
import nl.uva.sne.drip.api.exception.KeyException;
import nl.uva.sne.drip.api.service.ProvisionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import nl.uva.sne.drip.api.service.KeyPairService;
import nl.uva.sne.drip.api.service.UserService;
import nl.uva.sne.drip.drip.commons.data.v0.external.ConfUserKey;
import nl.uva.sne.drip.drip.commons.data.v1.external.Key;
import nl.uva.sne.drip.drip.commons.data.v1.external.KeyPair;
import nl.uva.sne.drip.drip.commons.data.v1.external.ProvisionRequest;
import nl.uva.sne.drip.drip.commons.data.v1.external.ProvisionResponse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
/**
* This controller is responsible for handling user public keys. These keys can
* be used by the provisoner to allow the user to login to the VMs from the
* machine the keys correspond to.
*
* @author S. Koulouzis
*/
@RestController
@RequestMapping("/user/v0.0/switch/provision")
@Component
@Deprecated
public class UserPublicKeysController0 {
@Autowired
private KeyPairService service;
@Autowired
private ProvisionService provisionService;
@RequestMapping(value = "/confuserkey", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
String uploadUserPublicKeys(@RequestBody ConfUserKey confUserKey) throws Exception {
try {
KeyPair pair = new KeyPair();
Key upk = new Key();
upk.setKey(confUserKey.file.get(0).content);
upk.setName(confUserKey.file.get(0).name);
upk.setType(Key.KeyType.PUBLIC);
pair.setPublicKey(upk);
pair = service.save(pair);
ProvisionResponse provPlan = provisionService.findOne(confUserKey.action);
List<String> keyPairIDs = new ArrayList<>();
keyPairIDs.add(pair.getId());
provPlan.setUserKeyPairIDs(keyPairIDs);
provisionService.save(provPlan);
return "Success: " + pair.getId();
} catch (KeyException ex) {
Logger.getLogger(UserPublicKeysController0.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
/*
* Copyright 2017 S. Koulouzis.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.api.v0.rest;
import javax.annotation.security.RolesAllowed;
import nl.uva.sne.drip.api.service.ProvisionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import nl.uva.sne.drip.api.service.ScriptService;
import nl.uva.sne.drip.api.service.UserService;
import nl.uva.sne.drip.drip.commons.data.v0.external.ConfScript;
import nl.uva.sne.drip.drip.commons.data.v1.external.ProvisionResponse;
import nl.uva.sne.drip.drip.commons.data.v1.external.Script;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* This controller is responsible for handling user scripts. These user can be
* used by the provisioner to run on the created VMs.
*
* @author S. Koulouzis
*/
@RestController
@RequestMapping("/user/v0.0/switch/provision")
@Component
@Deprecated
public class UserScriptController0 {
@Autowired
private ScriptService scriptService;
@RequestMapping(value = "/confscript", method = RequestMethod.POST, consumes = MediaType.TEXT_XML_VALUE)
@RolesAllowed({UserService.USER, UserService.ADMIN})
public @ResponseBody
String uploadUserScript(@RequestBody ConfScript confScript) {
Script script = new Script();
script.setContents(confScript.script);
script = scriptService.save(script);
return "Success: script for GUI is uploaded: " + script.getId();
}
}
......@@ -185,9 +185,7 @@ public class PlannerController {
List<PlanResponse> all = plannerService.findAll();
List<String> ids = new ArrayList<>();
for (PlanResponse tr : all) {
if (tr.getLevel() == 0) {
ids.add(tr.getId());
}
ids.add(tr.getId());
}
return ids;
}
......
......@@ -211,14 +211,14 @@ public class Converter {
public static Attribute plan1toFile(PlanResponse plan1) throws JSONException {
Attribute e = new Attribute();
e.level = String.valueOf(plan1.getLevel());
String p1Name = FilenameUtils.getBaseName(plan1.getName());
if (p1Name == null) {
p1Name = "Planned_tosca_file_" + plan1.getLevel();
plan1.setName(p1Name);
}
// e.level = String.valueOf(plan1.getLevel());
// String p1Name = FilenameUtils.getBaseName(plan1.getName());
// if (p1Name == null) {
// p1Name = "Planned_tosca_file_" + plan1.getLevel();
// plan1.setName(p1Name);
// }
e.name = p1Name;
// e.name = p1Name;
String ymlString = Converter.map2YmlString(plan1.getKeyValue());
e.content = ymlString.replaceAll("\n", "\\\\n");
return e;
......@@ -226,8 +226,8 @@ public class Converter {
public static PlanResponse File2Plan1(Attribute p0) {
PlanResponse p1 = new PlanResponse();
p1.setLevel(Integer.valueOf(p0.level));
p1.setName(p0.name);
// p1.setLevel(Integer.valueOf(p0.level));
// p1.setName(p0.name);
String yaml = p0.content.replaceAll("\\\\n", "\n");
p1.setKvMap(ymlString2Map(yaml));
......
......@@ -38,23 +38,6 @@ public class PlanResponse extends KeyValueHolder {
private Set<String> loweLevelPlansIDs;
/**
* The name of the generated plan
*
* @return the name
*/
@DocumentationExample("planner_output_all.yml")
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* The id of the TOSCA <code>PlaybookRepresentation</code> description from
* which this plan was generated
......@@ -72,25 +55,7 @@ public class PlanResponse extends KeyValueHolder {
public void setToscaID(String toscaID) {
this.toscaID = toscaID;
}
/**
* The level of the plan. Some provisioners use levels to represent a plan.
* In these cases there are two levels of TOSCA descriptions.
*
* @return the level
*/
@DocumentationExample("0")
public Integer getLevel() {
return level;
}
/**
* @param level the level to set
*/
public void setLevel(Integer level) {
this.level = level;
}
/**
* The list of the lower level plans attached to this plan. Some
* provisioners use levels to represent a plan. In these cases there are two
......
......@@ -56,6 +56,7 @@ public class P2PConverter {
List<Object> vmList = new ArrayList<>();
for (String vmName : vmNames) {
Map<String, Object> vm = (Map<String, Object>) topologyTemplate.get(vmName);
userName = (String) ((Map<String, Object>)vm.get("properties")).get("user_name");
vm.put("name", vmName);
vmList.add(vm);
}
......@@ -66,15 +67,15 @@ public class P2PConverter {
topTopology.topologies = new ArrayList<>();
boolean firstVM = true;
SubTopologyInfo sti = new SubTopologyInfo();
SubTopologyInfo subTopologyInfo = new SubTopologyInfo();
String provisionerScalingMode = "fixed";
SubTopology subTopology = createSubTopology(cloudProvider);
sti.cloudProvider = cloudProvider;
sti.topology = UUID.randomUUID().toString();
sti.domain = domainName;
sti.status = "fresh";
sti.statusInfo = null;
sti.tag = provisionerScalingMode;
subTopologyInfo.cloudProvider = cloudProvider;
subTopologyInfo.topology = UUID.randomUUID().toString();
subTopologyInfo.domain = domainName;
subTopologyInfo.status = "fresh";
subTopologyInfo.statusInfo = null;
subTopologyInfo.tag = provisionerScalingMode;
Map<String, SubTopologyInfo> subTopologyInfos = new HashMap<>();
for (Object element : vmList) {
......@@ -82,20 +83,20 @@ public class P2PConverter {
firstVM = false;
if (isScalable(element)) {
sti = new SubTopologyInfo();
subTopologyInfo = new SubTopologyInfo();
subTopology = createSubTopology(cloudProvider);
provisionerScalingMode = "scaling";
sti.cloudProvider = cloudProvider;
sti.topology = UUID.randomUUID().toString();
sti.domain = domainName;
sti.status = "fresh";
sti.tag = provisionerScalingMode;
sti.statusInfo = null;
subTopologyInfo.cloudProvider = cloudProvider;
subTopologyInfo.topology = UUID.randomUUID().toString();
subTopologyInfo.domain = domainName;
subTopologyInfo.status = "fresh";
subTopologyInfo.tag = provisionerScalingMode;
subTopologyInfo.statusInfo = null;
} else {
for (SubTopologyInfo info : subTopologyInfos.values()) {
if (!info.tag.equals("scaling")) {
sti = info;
subTopology = sti.subTopology;
subTopologyInfo = info;
subTopology = subTopologyInfo.subTopology;
break;
}
}
......@@ -109,8 +110,8 @@ public class P2PConverter {
subTopology.subnets = new ArrayList<>();
subTopology.subnets.add(s);
}
sti.subTopology = subTopology;
subTopologyInfos.put(sti.topology, sti);
subTopologyInfo.subTopology = subTopology;
subTopologyInfos.put(subTopologyInfo.topology, subTopologyInfo);
}
for (SubTopologyInfo info : subTopologyInfos.values()) {
topTopology.topologies.add(info);
......@@ -128,7 +129,7 @@ public class P2PConverter {
String yamlString = mapper.writeValueAsString(topTopology);
spc.topLevelContents = yamlString.substring(4);
Map<String, String> output = new HashMap<>();
Map<String, Object> output = new HashMap<>();
for (int i = 0; i < topTopology.topologies.size(); i++) {
String key = topTopology.topologies.get(i).topology;
String value = mapper.writeValueAsString(topTopology.topologies.get(i).subTopology);
......
......@@ -5,6 +5,6 @@ import java.util.Map;
public class SimplePlanContainer {
public String topLevelContents;
public Map<String, String> lowerLevelContents;
public Map<String, Object> lowerLevelContents;
}
......@@ -102,7 +102,13 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${ch.qos.logback.version}</version>
</dependency>
</dependency>
<dependency>
<groupId>nl.uva.sne.drip</groupId>
<artifactId>drip-planner2provisioner</artifactId>
<version>1.0-SNAPSHOT</version>
<type>jar</type>
</dependency>
</dependencies>
......
......@@ -70,11 +70,11 @@ public class RPCServer {
//We define the queue name
channel.queueDeclare(PropertyValues.RPC_QUEUE_NAME, false, false, false, null);
DefaultConsumer c;
if (PropertyValues.RPC_QUEUE_NAME.endsWith("v0")) {
c = new nl.uva.sne.drip.drip.provisioner.v0.Consumer(channel);
} else {
c = new nl.uva.sne.drip.drip.provisioner.v1.Consumer(channel, PropertyValues.HOST);
}
// if (PropertyValues.RPC_QUEUE_NAME.endsWith("v0")) {
// c = new nl.uva.sne.drip.drip.provisioner.v0.Consumer(channel);
// } else {
c = new nl.uva.sne.drip.drip.provisioner.v1.Consumer(channel, PropertyValues.HOST);
// }
//Start listening for messages
channel.basicConsume(PropertyValues.RPC_QUEUE_NAME, false, c);
......
......@@ -27,13 +27,18 @@ import java.security.cert.CertificateEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import nl.uva.sne.drip.commons.utils.AAUtils;
import nl.uva.sne.drip.commons.utils.AAUtils.SOURCE;
import static nl.uva.sne.drip.commons.utils.AAUtils.downloadCACertificates;
import nl.uva.sne.drip.commons.utils.Converter;
import nl.uva.sne.drip.drip.commons.data.internal.MessageParameter;
import nl.uva.sne.drip.drip.commons.data.v1.external.CloudCredentials;
import nl.uva.sne.drip.drip.converter.P2PConverter;
import nl.uva.sne.drip.drip.converter.SimplePlanContainer;
import org.apache.commons.io.FileUtils;
//import org.globus.myproxy.MyProxyException;
import org.ietf.jgss.GSSException;
......@@ -51,6 +56,7 @@ import provisioning.credential.ExoGENICredential;
* @author S. Koulouzis
*/
public class MessageParsing {
private static SimplePlanContainer simplePlan;
public static List<File> getTopologies(JSONArray parameters, String tempInputDirPath, int level) throws JSONException, IOException {
List<File> topologyFiles = new ArrayList<>();
......@@ -58,23 +64,35 @@ public class MessageParsing {
JSONObject param = (JSONObject) parameters.get(i);
String name = (String) param.get("name");
if (name.equals("topology")) {
JSONObject attributes = param.getJSONObject("attributes");
int fileLevel = Integer.valueOf((String) attributes.get("level"));
if (fileLevel == level) {
String originalFilename = (String) attributes.get("filename");
String fileName = originalFilename;
if (!fileName.endsWith(".yml")) {
fileName += ".yml";
}
String toscaPlan = new String(Base64.getDecoder().decode((String) param.get("value")));
Map<String, Object> toscaPlanMap = Converter.ymlString2Map(toscaPlan);
if (level == 0) {
simplePlan = P2PConverter.transfer(toscaPlanMap, null, null, null);
String fileName = "planner_output_all.yml";
File topologyFile = new File(tempInputDirPath + File.separator + fileName);
topologyFile.createNewFile();
String val = (String) param.get("value");
writeValueToFile(val, topologyFile);
writeValueToFile(simplePlan.topLevelContents, topologyFile);
topologyFiles.add(topologyFile);
//We should have only one top level topoloy
if (level == 0) {
return topologyFiles;
// if (level == 0) {
return topologyFiles;
// }
} else {
Set<String> keys = simplePlan.lowerLevelContents.keySet();
for (String key : keys) {
String fileName = key;
if (!fileName.endsWith(".yml")) {
fileName += ".yml";
}
File topologyFile = new File(tempInputDirPath + File.separator + fileName);
topologyFile.createNewFile();
String topologyContents = (String) simplePlan.lowerLevelContents.get(key);
writeValueToFile(topologyContents, topologyFile);
topologyFiles.add(topologyFile);
}
}
}
}
......
/*
* Copyright 2017 S. Koulouzis, Wang Junchao, Huan Zhou, Yang Hu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nl.uva.sne.drip.drip.provisioner.v0;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import nl.uva.sne.drip.drip.provisioner.utils.MessageParsing;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
*
* This is an example of a Message consumer
*
*
* @author H. Zhou, S. Koulouzis
*/
@Deprecated
public class Consumer extends DefaultConsumer {
private final Channel channel;
// private final String propertiesPath = "etc/consumer.properties";
Map<String, String> em = new HashMap<>();
// private String jarFilePath;
@Deprecated
public class TopologyElement {
String topologyName = "";
String outputFilePath = "";
}
@Deprecated
public Consumer(Channel channel) throws IOException {
super(channel);
this.channel = channel;
// Properties prop = new Properties();
// try (InputStream in = new FileInputStream(propertiesPath)) {
// prop.load(in);
// }
// jarFilePath = prop.getProperty("jar.file.path", "/root/SWITCH/bin/ProvisioningCore.jar");
// File jarFile = new File(jarFilePath);
// if (!jarFile.exists()) {
// throw new IOException(jarFile.getAbsolutePath() + " not found!");
// } else {
// jarFilePath = jarFile.getAbsolutePath();
// }
em.put("Virginia", "ec2.us-east-1.amazonaws.com");
em.put("California", "ec2.us-west-1.amazonaws.com");
em.put("Oregon", "ec2.us-west-2.amazonaws.com");
em.put("Mumbai", "ec2.ap-south-1.amazonaws.com");
em.put("Singapore", "ec2.ap-southeast-1.amazonaws.com");
em.put("Seoul", "ec2.ap-northeast-2.amazonaws.com");
em.put("Sydney", "ec2.ap-southeast-2.amazonaws.com");
em.put("Tokyo", "ec2.ap-northeast-1.amazonaws.com");
em.put("Frankfurt", "ec2.eu-central-1.amazonaws.com");
em.put("Ireland", "ec2.eu-west-1.amazonaws.com");
em.put("Paulo", "ec2.sa-east-1.amazonaws.com");
}
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//Create the reply properties which tells us where to reply, and which id to use.
//No need to change anything here
AMQP.BasicProperties replyProps = new AMQP.BasicProperties.Builder()
.correlationId(properties.getCorrelationId())
.build();
String response = "";
try {
//The queue only moves bytes so we need to convert them to stting
String message = new String(body, "UTF-8");
String tempInputDirPath = System.getProperty("java.io.tmpdir") + File.separator + "Input-" + Long.toString(System.nanoTime()) + File.separator;
File tempInputDir = new File(tempInputDirPath);
if (!(tempInputDir.mkdirs())) {
throw new FileNotFoundException("Could not create input directory: " + tempInputDir.getAbsolutePath());
}
ArrayList topologyInfoArray;
topologyInfoArray = invokeProvisioner(message, tempInputDirPath);
response = generateResponse(topologyInfoArray);
} catch (Throwable ex) {
try {
response = generateExeptionResponse(ex);
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
} catch (JSONException ex1) {
response = "{\"creationDate\": " + System.currentTimeMillis()
+ ",\"parameters\": [{\"url\": null,\"encoding\": UTF-8,"
+ "\"value\": \"" + ex.getMessage() + "\",\"name\": \""
+ ex.getClass().getName() + "\",\"attributes\": null}]}";
}
} finally {
Logger.getLogger(Consumer.class.getName()).log(Level.INFO, "Sending Response: {0}", response);
//We send the response back. No need to change anything here
channel.basicPublish("", properties.getReplyTo(), replyProps, response.getBytes("UTF-8"));
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
////If the provisioner jar file is successfully invoked, the returned value should be a set of output file paths which are expected.
////If there are some errors or some information missing with this message, the returned value will be null.
////The input dir path contains '/'
private ArrayList<TopologyElement> invokeProvisioner(String message, String tempInputDirPath) throws IOException, JSONException {
//Use the Jackson API to convert json to Object
JSONObject jo = new JSONObject(message);
JSONArray parameters = jo.getJSONArray("parameters");
//Create tmp input files
File ec2ConfFile = null;
File geniConfFile = null;
//loop through the parameters in a message to find the input files
String logDir, mainTopologyPath, sshKeyFilePath = null, scriptPath = null;
ArrayList<TopologyElement> topologyInfoArray = new ArrayList();
List<String> certificateNames = new ArrayList();
File cloudConfFile = getCloudConfigurationFile(parameters, tempInputDirPath);
if (cloudConfFile.getName().toLowerCase().contains("ec2")) {
ec2ConfFile = cloudConfFile;
} else if (cloudConfFile.getName().toLowerCase().contains("geni")) {
geniConfFile = cloudConfFile;
}
File topologyFile = MessageParsing.getTopologies(parameters, tempInputDirPath, 0).get(0);
File mainTopologyFile = new File(tempInputDirPath + "topology_main");
FileUtils.moveFile(topologyFile, mainTopologyFile);
mainTopologyPath = mainTopologyFile.getAbsolutePath();
topologyFile = MessageParsing.getTopologies(parameters, tempInputDirPath, 1).get(0);
File secondaryTopologyFile = new File(tempInputDirPath + File.separator + topologyFile.getName() + ".yml");
String outputFilePath = tempInputDirPath + File.separator + topologyFile.getName() + "_provisioned.yml";
TopologyElement x = new TopologyElement();
x.topologyName = topologyFile.getName();
x.outputFilePath = outputFilePath;
topologyInfoArray.add(x);
FileUtils.moveFile(topologyFile, secondaryTopologyFile);
Map<String, File> certificatesMap = getCertificates(parameters, tempInputDirPath);
certificateNames.addAll(certificatesMap.keySet());
logDir = getLogDirPath(parameters, tempInputDirPath);
File sshKey = MessageParsing.getSSHKeys(parameters, tempInputDirPath, "user.pem", "sshkey").get(0);
if (sshKey != null) {
sshKeyFilePath = sshKey.getAbsolutePath();
}
File scriptFile = getSciptFile(parameters, tempInputDirPath);
if (scriptFile != null) {
scriptPath = scriptFile.getAbsolutePath();
}
File curDir = new File(tempInputDirPath);
for (File f : curDir.listFiles()) {
String fileType = FilenameUtils.getExtension(f.getName());
if (fileType != null) {
if (fileType.equals("yml")) {
String toscaFile = f.getAbsolutePath();
if (sshKeyFilePath != null) {
changeKeyFilePath(toscaFile, sshKeyFilePath);
}
if (scriptPath != null) {
changeGUIScriptFilePath(toscaFile, scriptPath);
}
}
}
}
if (ec2ConfFile == null && geniConfFile == null) {
return null;
}
if (mainTopologyPath == null) {
return null;
}
String ec2ConfFilePath = null;
String geniConfFilePath = null;
if (ec2ConfFile != null) {
ec2ConfFilePath = ec2ConfFile.getAbsolutePath();
Properties prop = new Properties();
prop.load(new FileInputStream(ec2ConfFile));
StringBuilder supportDomains = new StringBuilder();
String prefix = "";
for (String certName : certificateNames) {
String supported = this.em.get(certName);
if (supported != null) {
supportDomains.append(prefix);
prefix = ", ";
supportDomains.append(supported);
}
}
prop.setProperty("KeyDir", tempInputDirPath);
prop.setProperty("SupportDomains", supportDomains.toString());
prop.store(new FileOutputStream(ec2ConfFile), null);
}
if (geniConfFile != null) {
geniConfFilePath = geniConfFile.getAbsolutePath();
Properties prop = new Properties();
prop.load(new FileInputStream(geniConfFile));
prop.propertyNames();
prop.setProperty("KeyDir", tempInputDirPath);
prop.store(new FileOutputStream(geniConfFile), null);
}
String cmd = "ec2=" + ec2ConfFilePath + " exogeni=" + geniConfFilePath + " logDir=" + logDir + " topology=" + mainTopologyPath;
// Provisioning.ProvisioningCore.main(cmd.split(" "));
// String cmd = "java -jar " + jarFilePath + " ec2=" + ec2ConfFilePath + " exogeni=" + geniConfFilePath + " logDir=" + logDir + " topology=" + mainTopologyPath;
// try {
// Logger.getLogger(Consumer.class.getName()).log(Level.INFO, "Executing: " + cmd);
// Process p = Runtime.getRuntime().exec(cmd);
// p.waitFor();
// } catch (IOException | InterruptedException e) {
// // TODO Auto-generated catch block
// Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, e);
// }
x = new TopologyElement();
x.topologyName = "topology";
x.outputFilePath = tempInputDirPath + "file_topology";
topologyInfoArray.add(x);
return topologyInfoArray;
}
////Change the key file path in the tosca file.
////Because the user needs to upload their public key file into the server file system.
private void changeKeyFilePath(String toscaFilePath, String newKeyFilePath) {
File toscaFile = new File(toscaFilePath);
String fileContent = "";
try (BufferedReader in = new BufferedReader(new FileReader(toscaFile))) {
String line;
while ((line = in.readLine()) != null) {
if (line.contains("publicKeyPath")) {
fileContent += ("publicKeyPath: " + newKeyFilePath + "\n");
} else {
fileContent += (line + "\n");
}
}
try (FileWriter fw = new FileWriter(toscaFilePath, false)) {
fw.write(fileContent);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, e);
} catch (IOException e) {
// TODO Auto-generated catch block
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, e);
}
}
private void changeGUIScriptFilePath(String toscaFilePath, String newScriptPath) {
File toscaFile = new File(toscaFilePath);
String fileContent = "";
try (BufferedReader in = new BufferedReader(new FileReader(toscaFile))) {
String line;
while ((line = in.readLine()) != null) {
if (line.contains("script")) {
int index = line.indexOf("script:");
String prefix = line.substring(0, index + 7);
fileContent += (prefix + " " + newScriptPath + "\n");
} else {
fileContent += (line + "\n");
}
}
try (FileWriter fw = new FileWriter(toscaFilePath, false)) {
fw.write(fileContent);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, e);
} catch (IOException e) {
// TODO Auto-generated catch block
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, e);
}
}
private String generateResponse(ArrayList<TopologyElement> outputs) throws JSONException, IOException {
//Use the JSONObject API to convert Object (Message) to json
JSONObject jo = new JSONObject();
jo.put("creationDate", (System.currentTimeMillis()));
List parameters = new ArrayList();
String charset = "UTF-8";
if (outputs == null) {
Map<String, String> fileArguments = new HashMap<>();
fileArguments.put("encoding", charset);
fileArguments.put("name", "ERROR");
fileArguments.put("value", "Some error with input messages!");
parameters.add(fileArguments);
} else {
for (int i = 0; i < outputs.size(); i++) {
Map<String, String> fileArguments = new HashMap<>();
fileArguments.put("encoding", charset);
File f = new File(outputs.get(i).outputFilePath);
if (f.exists()) {
fileArguments.put("name", outputs.get(i).topologyName);
byte[] bytes = Files.readAllBytes(Paths.get(f.getAbsolutePath()));
fileArguments.put("value", new String(bytes, charset));
parameters.add(fileArguments);
} else {
fileArguments.put("name", outputs.get(i).topologyName);
fileArguments.put("value", "ERROR::There is no output for topology " + outputs.get(i).topologyName);
parameters.add(fileArguments);
}
}
}
jo.put("parameters", parameters);
return jo.toString();
}
private String generateExeptionResponse(Throwable ex) throws JSONException {
JSONObject jo = new JSONObject();
jo.put("creationDate", (System.currentTimeMillis()));
List parameters = new ArrayList();
String charset = "UTF-8";
Map<String, String> errorArgument = new HashMap<>();
errorArgument.put("encoding", charset);
errorArgument.put("name", ex.getClass().getName());
errorArgument.put("value", ex.getMessage());
parameters.add(errorArgument);
jo.put("parameters", parameters);
return jo.toString();
}
private File getCloudConfigurationFile(JSONArray parameters, String tempInputDirPath) throws JSONException {
for (int i = 0; i < parameters.length(); i++) {
JSONObject param = (JSONObject) parameters.get(i);
String name = (String) param.get("name");
if (name.equals("ec2.conf") || name.equals("geni.conf")) {
try {
File confFile = new File(tempInputDirPath + File.separator + name);
if (confFile.createNewFile()) {
MessageParsing.writeValueToFile((String) param.get("value"), confFile);
return confFile;
} else {
return null;
}
} catch (IOException e) {
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, e);
return null;
}
}
}
return null;
}
private Map<String, File> getCertificates(JSONArray parameters, String tempInputDirPath) throws JSONException, IOException {
Map<String, File> files = new HashMap<>();
for (int i = 0; i < parameters.length(); i++) {
JSONObject param = (JSONObject) parameters.get(i);
String name = (String) param.get("name");
if (name.equals("certificate")) {
JSONObject attribute = param.getJSONObject("attributes");
String fileName = (String) attribute.get("filename");
File certificate = new File(tempInputDirPath + File.separator + fileName + ".pem");
if (certificate.createNewFile()) {
MessageParsing.writeValueToFile((String) param.get("value"), certificate);
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_READ);
Files.setPosixFilePermissions(Paths.get(certificate.getAbsolutePath()), perms);
files.put(fileName, certificate);
}
}
}
return files;
}
private String getLogDirPath(JSONArray parameters, String tempInputDirPath) throws JSONException {
for (int i = 0; i < parameters.length(); i++) {
JSONObject param = (JSONObject) parameters.get(i);
String name = (String) param.get("name");
if (name.equals("logdir")) {
return (String) param.get("value");
}
}
return System.getProperty("java.io.tmpdir");
}
private File getSciptFile(JSONArray parameters, String tempInputDirPath) throws JSONException, IOException {
for (int i = 0; i < parameters.length(); i++) {
JSONObject param = (JSONObject) parameters.get(i);
String name = (String) param.get("name");
if (name.equals("guiscript")) {
String scriptContent = (String) param.get("value");
File scriptFile = new File(tempInputDirPath + File.separator + "guiscipt.sh");
if (scriptFile.createNewFile()) {
MessageParsing.writeValueToFile(scriptContent, scriptFile);
return scriptFile;
}
}
}
return null;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment