blob: 142d2b21b8676ba6f1dabc553d23f1ce7def32b7 [file] [log] [blame]
rdudyala996d70b2016-10-13 17:40:55 +00001import hashlib
2import os
3import socket
4import sys
5import base64
6import time
7import json
8#import threading
9import subprocess
10import random
11import tempfile
12#from sshtunnel import SSHTunnelForwarder
13from django.db.models import F, Q
14from xos.config import Config
Murat Parlakisik638c65f2017-05-31 11:10:24 +030015from synchronizers.new_base.syncstep import SyncStep
16from synchronizers.new_base.ansible_helper import run_template
17from synchronizers.new_base.ansible_helper import run_template_ssh
18from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
19from modelaccessor import *
20#from core.models import Service, Slice
21#from services.monitoring.models import CeilometerService, OpenStackServiceMonitoringPublisher
rdudyala996d70b2016-10-13 17:40:55 +000022from xos.logger import Logger, logging
23
24parentdir = os.path.join(os.path.dirname(__file__),"..")
25sys.path.insert(0,parentdir)
26
27logger = Logger(level=logging.INFO)
28
29class SyncOpenStackMonitoringPublisher(SyncInstanceUsingAnsible):
30 provides=[OpenStackServiceMonitoringPublisher]
31 observes=OpenStackServiceMonitoringPublisher
32 requested_interval=0
33 template_name = "sync_openstackmonitoringpublisher.yaml"
34
35 def __init__(self, *args, **kwargs):
36 super(SyncOpenStackMonitoringPublisher, self).__init__(*args, **kwargs)
37
38 def fetch_pending(self, deleted):
39 if (not deleted):
40 objs = OpenStackServiceMonitoringPublisher.get_tenant_objects().filter(Q(enacted__lt=F('updated')) | Q(enacted=None),Q(lazy_blocked=False))
41 else:
42 objs = OpenStackServiceMonitoringPublisher.get_deleted_tenant_objects()
43
44 return objs
45
46 def sync_record(self, o):
47 logger.info("sync'ing object %s" % str(o),extra=o.tologdict())
48
49 self.prepare_record(o)
50
51 ceilometer_services = CeilometerService.get_service_objects().filter(id=o.provider_service.id)
52 if not ceilometer_services:
53 raise "No associated Ceilometer service"
54 ceilometer_service = ceilometer_services[0]
55 service_instance = ceilometer_service.get_instance()
56 # sync only when the corresponding service instance is fully synced
57 if not service_instance:
58 self.defer_sync(o, "waiting on associated service instance")
59 return
60 if not service_instance.instance_name:
61 self.defer_sync(o, "waiting on associated service instance.instance_name")
62 return
63
64 # Step1: Orchestrate UDP proxy agent on the compute node where monitoring service VM is spawned
65
66 fields = { "hostname": ceilometer_service.ceilometer_rabbit_compute_node,
67 "baremetal_ssh": True,
68 "instance_name": "rootcontext",
69 "username": "root",
70 "container_name": None,
71 "rabbit_host": ceilometer_service.ceilometer_rabbit_host,
72 "rabbit_user": ceilometer_service.ceilometer_rabbit_user,
73 "rabbit_password": ceilometer_service.ceilometer_rabbit_password,
74 "listen_ip_addr": socket.gethostbyname(ceilometer_service.ceilometer_rabbit_compute_node)
75 }
76
77 # If 'o' defines a 'sync_attributes' list, then we'll copy those
78 # attributes into the Ansible recipe's field list automatically.
79 if hasattr(o, "sync_attributes"):
80 for attribute_name in o.sync_attributes:
81 fields[attribute_name] = getattr(o, attribute_name)
82
83 key_name = self.get_node_key(service_instance.node)
84 if not os.path.exists(key_name):
85 raise Exception("Node key %s does not exist" % key_name)
86 key = file(key_name).read()
87 fields["private_key"] = key
88
89 template_name = "sync_openstackmonitoringpublisher.yaml"
90 fields["ansible_tag"] = o.__class__.__name__ + "_" + str(o.id) + "_step1"
91
92 self.run_playbook(o, fields, template_name)
93
94 # Step2: Orchestrate OpenStack publish agent
95 target_uri = "udp://" + ceilometer_service.ceilometer_rabbit_compute_node + ":4455"
96 fields = {}
97 agent_info = []
98 if o.monitoring_agents:
99 for agent in o.monitoring_agents.all():
100 body = {'target': target_uri}
101 if agent.start_url_json_data:
102 start_url_dict = json.loads(agent.start_url_json_data)
Srikanth Vavilapallif2919002016-12-19 18:32:20 +0000103 body.update(start_url_dict)
rdudyala996d70b2016-10-13 17:40:55 +0000104 a = {'url': agent.start_url, 'body': json.dumps(body)}
105 agent_info.append(a)
106
107 fields["agents"] = agent_info
108 #fields["private_key"] = ""
109
110 template_name = "enable_monitoring_service.yaml"
111 fields["ansible_tag"] = o.__class__.__name__ + "_" + str(o.id) + "_step2"
112
Sapan Bhatia02c783e2017-02-04 09:26:30 -0800113 run_template(template_name, fields, object=o)
rdudyala996d70b2016-10-13 17:40:55 +0000114
rdudyala996d70b2016-10-13 17:40:55 +0000115 def map_delete_inputs(self, o):
116 fields = {"unique_id": o.id,
117 "delete": True}
118 return fields
119
120 def delete_record(self, o):
121 pass
122