blob: 9dbcef244620a468f71d019399257f7c89635615 [file] [log] [blame]
Scott Bakerc1b28792015-10-26 19:51:34 -07001import hashlib
2import os
3import socket
4import sys
5import base64
6import time
7from django.db.models import F, Q
8from xos.config import Config
Scott Baker54c5a7f2015-11-16 20:57:30 -08009from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
Scott Bakerc1b28792015-10-26 19:51:34 -070010from observer.syncstep import SyncStep
11from observer.ansible import run_template_ssh
Scott Bakerdcf9e0d2015-11-09 16:17:11 -080012from core.models import Service, Slice, Instance
Scott Bakerc1b28792015-10-26 19:51:34 -070013from services.onos.models import ONOSService, ONOSApp
14from util.logger import Logger, logging
15
16# hpclibrary will be in steps/..
17parentdir = os.path.join(os.path.dirname(__file__),"..")
18sys.path.insert(0,parentdir)
19
20logger = Logger(level=logging.INFO)
21
Scott Baker54c5a7f2015-11-16 20:57:30 -080022class SyncContainer(SyncInstanceUsingAnsible):
Scott Bakerdcf9e0d2015-11-09 16:17:11 -080023 provides=[Instance]
24 observes=Instance
Scott Bakerc1b28792015-10-26 19:51:34 -070025 requested_interval=0
26 template_name = "sync_container.yaml"
27
28 def __init__(self, *args, **kwargs):
29 super(SyncContainer, self).__init__(*args, **kwargs)
30
Scott Bakerdcf9e0d2015-11-09 16:17:11 -080031 def fetch_pending(self, deletion=False):
32 objs = super(SyncContainer, self).fetch_pending(deletion)
Scott Bakera8c8a422015-11-12 17:26:58 -080033 objs = [x for x in objs if x.isolation in ["container", "container_vm"]]
Scott Bakerdcf9e0d2015-11-09 16:17:11 -080034 return objs
Scott Bakerc1b28792015-10-26 19:51:34 -070035
Scott Baker4293d732015-10-27 21:20:19 -070036 def get_instance_port(self, container_port):
Scott Baker4293d732015-10-27 21:20:19 -070037 for p in container_port.network.links.all():
Scott Baker38a68882015-11-09 16:45:07 -080038 if (p.instance) and (p.instance.isolation=="vm") and (p.instance.node == container_port.instance.node) and (p.mac):
Scott Baker4293d732015-10-27 21:20:19 -070039 return p
40 return None
41
42 def get_ports(self, o):
43 i=0
44 ports = []
45 for port in o.ports.all():
46 if not port.mac:
47 raise Exception("Port on network %s is not yet ready" % port.network.name)
48
49 pd={}
50 pd["device"] = "eth%d" % i
51 pd["mac"] = port.mac
52 pd["ip"] = port.ip
53
Scott Bakera8c8a422015-11-12 17:26:58 -080054 if o.isolation == "container":
55 # container on bare metal
56 instance_port = self.get_instance_port(port)
57 if not instance_port:
58 raise Exception("No instance on slice for port on network %s" % port.network.name)
Scott Baker4293d732015-10-27 21:20:19 -070059
Scott Bakera8c8a422015-11-12 17:26:58 -080060 pd["snoop_instance_mac"] = instance_port.mac
61 pd["snoop_instance_id"] = instance_port.instance.instance_id
62 pd["src_device"] = ""
63 else:
64 # container in VM
65 pd["snoop_instance_mac"] = ""
66 pd["snoop_instance_id"] = ""
67 pd["src_device"] = "eth%d" % i
Scott Baker4293d732015-10-27 21:20:19 -070068
Scott Baker4b2232c2015-11-16 16:22:45 -080069 for (k,v) in port.get_parameters().items():
70 pd[k] = v
71
Scott Baker4293d732015-10-27 21:20:19 -070072 ports.append(pd)
Scott Baker50fcafa2015-11-02 20:25:55 -080073
74 i = i + 1
75
Scott Baker4293d732015-10-27 21:20:19 -070076 return ports
77
Scott Bakerc1b28792015-10-26 19:51:34 -070078 def get_extra_attributes(self, o):
79 fields={}
80 fields["ansible_tag"] = "container-%s" % str(o.id)
Scott Baker4293d732015-10-27 21:20:19 -070081 fields["container_name"] = "%s-%s" % (o.slice.name, str(o.id))
Scott Bakerdcf9e0d2015-11-09 16:17:11 -080082 fields["docker_image"] = o.image.name
Scott Baker4293d732015-10-27 21:20:19 -070083 fields["ports"] = self.get_ports(o)
Scott Bakera8c8a422015-11-12 17:26:58 -080084 if o.volumes:
85 fields["volumes"] = [x.strip() for x in o.volumes.split(",")]
86 else:
87 fields["volumes"] = ""
Scott Bakerc1b28792015-10-26 19:51:34 -070088 return fields
89
90 def sync_fields(self, o, fields):
91 self.run_playbook(o, fields)
92
93 def sync_record(self, o):
94 logger.info("sync'ing object %s" % str(o))
95
Scott Baker54c5a7f2015-11-16 20:57:30 -080096 fields = self.get_ansible_fields(o)
Scott Bakerc1b28792015-10-26 19:51:34 -070097
98 # If 'o' defines a 'sync_attributes' list, then we'll copy those
99 # attributes into the Ansible recipe's field list automatically.
100 if hasattr(o, "sync_attributes"):
101 for attribute_name in o.sync_attributes:
102 fields[attribute_name] = getattr(o, attribute_name)
103
104 fields.update(self.get_extra_attributes(o))
105
106 self.sync_fields(o, fields)
107
Scott Baker91d5aac2015-11-11 09:28:32 -0800108 o.instance_id = fields["container_name"]
109 o.instance_name = fields["container_name"]
110
Scott Bakerc1b28792015-10-26 19:51:34 -0700111 o.save()
112
113 def run_playbook(self, o, fields):
114 tStart = time.time()
115 run_template_ssh(self.template_name, fields, path="container")
116 logger.info("playbook execution time %d" % int(time.time()-tStart))
117
118 def delete_record(self, m):
119 pass