Merge remote-tracking branch 'origin/master' into reconcile_openstack
diff --git a/xos/observers/vcpe/steps/sync_vcpetenant.py b/xos/observers/vcpe/steps/sync_vcpetenant.py
index bc08845..7ce3eaa 100644
--- a/xos/observers/vcpe/steps/sync_vcpetenant.py
+++ b/xos/observers/vcpe/steps/sync_vcpetenant.py
@@ -107,8 +107,8 @@
                 logger.info("unsupported configuration -- bbs_slice is set, but backend_network_label is not")
             if not bbs_addrs:
                 logger.info("failed to find any usable addresses on bbs_slice")
-        elif vcpe.bbs_server:
-            bbs_addrs.append(vcpe.bbs_server)
+        elif vcpe_service.bbs_server:
+            bbs_addrs.append(vcpe_service.bbs_server)
         else:
             logger.info("neither bbs_slice nor bbs_server is configured in the vCPE")
 
diff --git a/xos/tosca/custom_types/xos.m4 b/xos/tosca/custom_types/xos.m4
index 471bfc8..9ba9973 100644
--- a/xos/tosca/custom_types/xos.m4
+++ b/xos/tosca/custom_types/xos.m4
@@ -27,6 +27,15 @@
                 required: false
             icon_url:
                 type: string
+                required: false
+            enabled:
+                type: boolean
+                default: true
+            published:
+                type: boolean
+                default: true
+            public_key:
+                type: string
                 required: false)
 
 # end m4 macros
diff --git a/xos/tosca/resources/network.py b/xos/tosca/resources/network.py
index 96bc190..e5b8b80 100644
--- a/xos/tosca/resources/network.py
+++ b/xos/tosca/resources/network.py
@@ -4,6 +4,7 @@
 import tempfile
 sys.path.append("/opt/tosca")
 from translator.toscalib.tosca_template import ToscaTemplate
+import pdb
 
 from core.models import Slice,User,Network,NetworkTemplate
 
@@ -12,7 +13,6 @@
 class XOSNetwork(XOSResource):
     provides = ["tosca.nodes.network.Network", "tosca.nodes.network.Network.XOS"]
     xos_model = Network
-    defaults = {"permit_all_slices": True}
 
     def get_xos_args(self):
         args = {"name": self.nodetemplate.name,
@@ -26,11 +26,16 @@
         if net_template_name:
             args["template"] = self.get_xos_object(NetworkTemplate, name=net_template_name)
 
-        # copy simple string properties from the template into the arguments
-        for prop in ["ports", "labels", "permit_all_slices"]:
-            v = self.get_property(prop, self.defaults.get(prop,None))
-            if v:
-                args[prop] = v
+        if self.nodetemplate.type == "tosca.nodes.network.Network.XOS":
+            # copy simple string properties from the template into the arguments
+            for prop in ["ports", "labels", "permit_all_slices"]:
+                v = self.get_property(prop)
+                if v:
+                    args[prop] = v
+        else:
+            # tosca.nodes.network.Netwrok is not as rich as an XOS network. So
+            # we have to manually fill in some defaults.
+            args["permit_all_slices"] = True
 
         return args
 
diff --git a/xos/tosca/resources/service.py b/xos/tosca/resources/service.py
index 6b84d0b..4b32b8a 100644
--- a/xos/tosca/resources/service.py
+++ b/xos/tosca/resources/service.py
@@ -4,6 +4,7 @@
 import tempfile
 sys.path.append("/opt/tosca")
 from translator.toscalib.tosca_template import ToscaTemplate
+import pdb
 
 from core.models import Service,User,CoarseTenant
 
@@ -12,7 +13,7 @@
 class XOSService(XOSResource):
     provides = "tosca.nodes.Service"
     xos_model = Service
-    copyin_props = ["view_url", "kind"]
+    copyin_props = ["view_url", "kind", "enabled", "published", "public_key"]
 
     def postprocess(self, obj):
         for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
diff --git a/xos/tosca/resources/vcpeservice.py b/xos/tosca/resources/vcpeservice.py
index a2247c6..e163520 100644
--- a/xos/tosca/resources/vcpeservice.py
+++ b/xos/tosca/resources/vcpeservice.py
@@ -12,5 +12,5 @@
 class XOSVcpeService(XOSService):
     provides = "tosca.nodes.VCPEService"
     xos_model = VCPEService
-    copyin_props = ["view_url", "icon_url", "backend_network_label"]
+    copyin_props = ["view_url", "icon_url", "backend_network_label", "enabled", "published", "public_key"]
 
diff --git a/xos/tosca/resources/xosresource.py b/xos/tosca/resources/xosresource.py
index 8507172..159156b 100644
--- a/xos/tosca/resources/xosresource.py
+++ b/xos/tosca/resources/xosresource.py
@@ -1,4 +1,6 @@
+import os
 import pdb
+import json
 
 class XOSResource(object):
     xos_base_class = "XOSResource"
@@ -52,11 +54,8 @@
         else:
             return {}
 
-    def get_property(self, name, default=None):
-        v = self.nodetemplate.get_property_value(name)
-        if (v==None):
-            return default
-        return v
+    def get_property(self, name):
+        return self.nodetemplate.get_property_value(name)
 
     def get_xos_object(self, cls, throw_exception=True, **kwargs):
         objs = cls.objects.filter(**kwargs)
@@ -86,6 +85,37 @@
     def postprocess(self, obj):
         pass
 
+    def intrinsic_get_artifact(self, obj=None, name=None, method=None):
+        if obj!="SELF":
+            raise Exception("only SELF is supported for get_artifact first arg")
+        if method!="LOCAL_FILE":
+            raise Exception("only LOCAL_FILE is supported for get_artifact third arg")
+
+        for (k,v) in self.nodetemplate.entity_tpl.get("artifacts", {}).items():
+            if k == name:
+                if not os.path.exists(v):
+                    raise Exception("Artifact local file %s for artifact %s does not exist" % (v, k))
+                return open(v).read()
+
+        raise Exception("artifact %s not found" % name)
+
+    def try_intrinsic_function(self, v):
+        try:
+            jsv = v.replace("'", '"')
+            jsv = json.loads(jsv)
+        except:
+            #import traceback
+            #traceback.print_exc()
+            return v
+
+        if type(jsv)!=dict:
+            return v
+
+        if "get_artifact" in jsv:
+            return self.intrinsic_get_artifact(*jsv["get_artifact"])
+
+        return v
+
     def get_xos_args(self):
         args = {}
 
@@ -95,6 +125,9 @@
         # copy simple string properties from the template into the arguments
         for prop in self.copyin_props:
             v = self.get_property(prop)
+
+            v = self.try_intrinsic_function(v)
+
             if v:
                 args[prop] = v
 
diff --git a/xos/tosca/samples/cord.yaml b/xos/tosca/samples/cord.yaml
index f160cb6..885435d 100644
--- a/xos/tosca/samples/cord.yaml
+++ b/xos/tosca/samples/cord.yaml
@@ -27,6 +27,9 @@
       properties:
           view_url: /admin/cord/vcpeservice/$id$/
           backend_network_label: hpc_client
+          public_key: { get_artifact: [ SELF, pubkey, LOCAL_FILE] }
+      artifacts:
+          pubkey: /opt/xos/observers/vcpe/vcpe_public_key
 
     service_vbng:
       type: tosca.nodes.VBNGService