migrate code over from xos repo
Change-Id: I764ac3196babdb1ce78dded2b2d8d6ad6e965ca6
diff --git a/xos/synchronizer/model_policies/model_policy_Instance.py b/xos/synchronizer/model_policies/model_policy_Instance.py
new file mode 100644
index 0000000..dd1a8d5
--- /dev/null
+++ b/xos/synchronizer/model_policies/model_policy_Instance.py
@@ -0,0 +1,58 @@
+def handle_container_on_metal(instance):
+ from core.models import Instance, Flavor, Port, Image
+
+ print "MODEL POLICY: instance", instance, "handle container_on_metal"
+
+ if instance.deleted:
+ return
+
+ if (instance.isolation in ["container"]) and (instance.slice.network not in ["host", "bridged"]):
+ # Our current docker-on-metal network strategy requires that there be some
+ # VM on the server that connects to the networks, so that
+ # the containers can piggyback off of that configuration.
+ if not Instance.objects.filter(slice=instance.slice, node=instance.node, isolation="vm").exists():
+ flavors = Flavor.objects.filter(name="m1.small")
+ if not flavors:
+ raise XOSConfigurationError("No m1.small flavor")
+
+ images = Image.objects.filter(kind="vm")
+
+ companion_instance = Instance(slice = instance.slice,
+ node = instance.node,
+ image = images[0],
+ creator = instance.creator,
+ deployment = instance.node.site_deployment.deployment,
+ flavor = flavors[0])
+ companion_instance.save()
+
+ print "MODEL POLICY: instance", instance, "created companion", companion_instance
+
+ # Add the ports for the container
+ for network in instance.slice.networks.all():
+ # hmmm... The NAT ports never become ready, because sync_ports never
+ # instantiates them. Need to think about this.
+ print "MODEL POLICY: instance", instance, "handling network", network
+ if (network.name.endswith("-nat")):
+ continue
+
+ if not Port.objects.filter(network=network, instance=instance).exists():
+ port = Port(network = network, instance=instance)
+ port.save()
+ print "MODEL POLICY: instance", instance, "created port", port
+
+def handle(instance):
+ from core.models import Controller, ControllerSlice, ControllerNetwork, NetworkSlice
+
+ networks = [ns.network for ns in NetworkSlice.objects.filter(slice=instance.slice)]
+ controller_networks = ControllerNetwork.objects.filter(network__in=networks,
+ controller=instance.node.site_deployment.controller)
+
+ for cn in controller_networks:
+ if (cn.lazy_blocked):
+ print "MODEL POLICY: instance", instance, "unblocking network", cn.network
+ cn.lazy_blocked=False
+ cn.backend_register = '{}'
+ cn.save()
+
+ if (instance.isolation in ["container", "container_vm"]):
+ handle_container_on_metal(instance)