Exporting Tosca from UI
Change-Id: Ie7e58ac5bd51a56d028daa1c1e2577e7723a8297
diff --git a/views/ngXosViews/serviceGrid/src/js/networks_encoder.service.js b/views/ngXosViews/serviceGrid/src/js/networks_encoder.service.js
new file mode 100644
index 0000000..1e6adee
--- /dev/null
+++ b/views/ngXosViews/serviceGrid/src/js/networks_encoder.service.js
@@ -0,0 +1,132 @@
+/**
+ * © OpenCORD
+ *
+ * Visit http://guide.xosproject.org/devguide/addview/ for more information
+ *
+ * Created by teone on 6/22/16.
+ */
+
+(function () {
+ 'use strict';
+
+ /**
+ * @ngdoc service
+ * @name xos.NetworkEncoder.serviceGrid
+ **/
+
+ // TODO write tests
+ angular.module('xos.serviceGrid')
+ .service('NetworkEncoder', function($q, Networks, NetworkTemplateEncoder){
+
+ this.buildTosca = (networks, toscaSpec) => {
+
+ const apiNetworks = angular.copy(networks);
+
+ // store here the promise that will build the dependency structure
+ let dependency = {
+ };
+
+ const d = $q.defer();
+
+ try {
+ networks = _.reduce(networks, (obj, n) => {
+ obj[`network#${n.name}`] = {
+ type: 'tosca.nodes.network.Network.XOS',
+ requirements: []
+ };
+
+ // for each network slice, add requirement
+ if(angular.isDefined(n.slices)) {
+ _.forEach(n.slices, s => {
+ let owner = {
+ owner: {
+ node: s.name,
+ relationship: 'tosca.relationships.MemberOfSlice'
+ }
+ };
+
+ let conn = {
+ connection: {
+ node: s.name,
+ relationship: 'tosca.relationships.ConnectsToSlice'
+ }
+ };
+ obj[`network#${n.name}`].requirements.push(owner, conn);
+ });
+
+ if(angular.isDefined(n.template)){
+ dependency[n.name] = NetworkTemplateEncoder.buildTosca(n.template, toscaSpec);
+ }
+ }
+
+ return obj;
+
+ }, {});
+
+ // if we have dependency wait for them
+ if(Object.keys(dependency).length > 0){
+ $q.all(dependency)
+ .then(deps => {
+ // NOTE how to make this readable??
+ if(deps){
+
+ // for each property in deps
+ for(let k of Object.keys(deps)){
+ let [tosca, template] = deps[k];
+ networks[`network#${k}`].requirements.push({
+ network_template: {
+ node: `network_template#${template.name}`,
+ relationship: 'tosca.relationships.UsesNetworkTemplate'
+ }
+ });
+ angular.extend(toscaSpec, tosca);
+ }
+ }
+ angular.extend(toscaSpec.topology_template.node_templates, networks);
+ d.resolve([toscaSpec, apiNetworks]);
+ })
+ .catch(e => {
+ throw new Error(e);
+ });
+ }
+ //else resolve directly
+ else {
+ angular.extend(toscaSpec.topology_template.node_templates, networks);
+ d.resolve([toscaSpec, apiNetworks]);
+ }
+ }
+ catch(e){
+ d.reject(e);
+ }
+
+ return d.promise;
+ };
+
+ this.getSliceNetworks = (slice, toscaSpec) => {
+ const d = $q.defer();
+ Networks.query({owner: slice.id}).$promise
+ .then((networks) => {
+ // check that all the network this slice own are listed in the slice
+ // does this make sense?
+ networks = _.filter(networks, n => {
+ return slice.networks.indexOf(n.id) !== -1;
+ });
+
+ // denormalize slice inside network
+ networks = networks.map(n => {
+ let idx = n.slices.indexOf(slice.id);
+ n.slices[idx] = slice;
+ return n;
+ });
+
+ this.buildTosca(networks, toscaSpec)
+ .then(d.resolve)
+ .catch(d.reject);
+
+ });
+
+ return d.promise;
+ }
+ });
+})();
+