예제 #1
0
def application(aDict):
 """Function docstring for application. Delivers the information for SDCP login to redirect to the openstack App.

 Args:
  - node (required)
  - appformix (optional)
  - name (optional)
  - token (optional)
 Output:
 """
 from datetime import datetime,timedelta
 ret = {'title':"%s 2 Cloud"%(aDict.get('name','iaas')),'choices':[],'message':"Welcome to the '%s' Cloud Portal"%(aDict.get('name','iaas')),'portal':'openstack' }
 try:
  if aDict.get('token'):
   controller = Device(SC['nodes'][aDict['node']],aDict.get('token'))
  else:
   controller = Device(SC['nodes'][aDict['node']],None)
   res = controller.auth({'project':SC['openstack']['project'], 'username':SC['openstack']['username'],'password':SC['openstack']['password']})
  auth = controller.call("5000","v3/projects")
  if auth['code'] == 200:
   projects = []
   for project in auth['data']['projects']:
    projects.append({'name':project['name'], 'id':"%s_%s"%(project['id'],project['name'])})
   ret['choices'] = [{'display':'Customer', 'id':'project', 'data':projects}]
 except Exception as e:
  ret['exception'] = str(e)
 ret['parameters'] = [{'display':'Username', 'id':'username', 'data':'text'},{'display':'Password', 'id':'password', 'data':'password'}]
 cookie = {'name':aDict.get('name','iaas'),'node':aDict['node'],'portal':'openstack'}
 if aDict.get('appformix'):
  cookie['appformix'] = aDict.get('appformix')
 ret['cookie'] = ",".join(["%s=%s"%(k,v) for k,v in cookie.iteritems()])
 ret['expires'] = (datetime.utcnow() + timedelta(hours=1)).strftime('%a, %d %b %Y %H:%M:%S GMT')
 return ret
예제 #2
0
def authenticate(aDict):
 """Function docstring for authenticate TBD

 Args:
  - node (required)
  - username (required)
  - project_id (required)
  - password (required)
  - project_name (required)

 Output:
 """
 from zdcp.core.logger import log
 ret = {}
 controller = Device(SC['nodes'][aDict['node']],None)
 res = controller.auth({'project':aDict['project_name'], 'username':aDict['username'],'password':aDict['password'] })
 ret = {'authenticated':res['auth']}
 if res['auth'] == 'OK':
  with DB() as db:
   ret.update({'project_name':aDict['project_name'],'project_id':aDict['project_id'],'username':aDict['username'],'token':controller.get_token(),'expires':controller.get_cookie_expire()})
   db.do("INSERT INTO openstack_tokens(token,expires,project_id,username,node) VALUES('%s','%s','%s','%s','%s')"%(controller.get_token(),controller.get_token_expire(),aDict['project_id'],aDict['username'],SC['nodes'][aDict['node']]))
   token_id = db.get_last_id()
   for service in ['heat','nova','neutron','glance']:
    svc = controller.get_service(service,'public')
    if len(svc['path']) > 0:
     svc['path'] = svc['path'] + '/'
    db.do("INSERT INTO openstack_services(id,service,service_port,service_url,service_id) VALUES('%s','%s','%s','%s','%s')"%(token_id,service,svc['port'],svc['path'],svc['id']))
   db.do("INSERT INTO openstack_services(id,service,service_port,service_url,service_id) VALUES('%s','%s','%s','%s','%s')"%(token_id,"contrail",8082,'',''))
  log("openstack_authenticate - successful login and catalog init for %s@%s"%(aDict['username'],aDict['node']))
 else:
  log("openstack_authenticate - error logging in for  %s@%s"%(aDict['username'],ctrl))
 return ret
예제 #3
0
def contrail_floating_ips(aDict):
 """Function docstring for contrail_floating_ips TBD

 Args:
  - token (required)
  - virtual_network (required)

 Output:
 """
 ret = {'virtual-network':aDict['virtual_network'],'ip_addresses':[]}
 with DB() as db:
  db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = 'contrail'"%(aDict['token']))
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 vn = controller.call(data['service_port'],data['service_url'] + "virtual-network/%s"%aDict['virtual_network'])['data']['virtual-network']
 for fipool in vn.get('floating_ip_pools',[]):
  pool = controller.call(data['service_port'],data['service_url'] +"floating-ip-pool/%s"%(fipool['uuid']) )['data']['floating-ip-pool']
  for fips in pool['floating_ips']:
   fip = controller.call(data['service_port'],data['service_url'] + "floating-ip/%s"%(fips['uuid']))['data']['floating-ip']
   record = {'pool_uuid':pool['uuid'],'pool_name':pool['name'],'ip_address':fip['floating_ip_address'],'uuid':fip['uuid'],'vm_ip_address':fip.get('floating_ip_fixed_ip_address')}
   if fip.get('floating_ip_fixed_ip_address'):
    vmi = controller.href(fip['virtual_machine_interface_refs'][0]['href'])['data']['virtual-machine-interface']
    record.update({'vm_interface':vmi['virtual_machine_refs'][0]['to'][0],'vm_network_uuid':vmi['virtual_network_refs'][0]['uuid'],'vm_network_name':vmi['virtual_network_refs'][0]['to'][2]})
   ret['ip_addresses'].append(record)
 return ret
예제 #4
0
def vm_console(aDict):
 """Function docstring for vm_console TBD

 Args:
  - token (required)
  - vm (required)

 Output:
 """
 ret = {'result':'NOT_OK','vm':aDict['vm']}
 with DB() as db:
  db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = 'nova'"%(aDict['token']))
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 try:
  res = controller.call(data['service_port'], data['service_url'] + "servers/%s/remote-consoles"%(aDict['vm']), {'remote_console':{ "protocol": "vnc", "type": "novnc" }}, header={'X-OpenStack-Nova-API-Version':'2.8'})
  if res['code'] == 200:
   url = res['data']['remote_console']['url']
   # URL is not always proxy ... so force it through: remove http:// and replace IP (assume there is a port..) with controller IP
   ret['url'] = "%s:%s"%(data['node'],url[7:].partition(':')[2])
   ret['result'] = 'OK'
  elif res['code'] == 401 and res['data'] == 'Authentication required':
   ret.update({'info':'Authentication required'})
 except Exception as e: ret = e[0]
 return ret
예제 #5
0
def vm_networks(aDict):
 """Function docstring for vm_networks TBD

 Args:
  - token (required)
  - vm (required)

 Output:
 """
 ret = {'result':'OK','vm':None,'interfaces':[]}
 with DB() as db:
  db.do("node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = 'contrail'"%(aDict['token']))
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 vm = controller.call(data['service_port'],data['service_url'] + "virtual-machine/%s"%aDict['vm'])['data']['virtual-machine']
 ret['vm'] = vm['name']
 for vmir in vm['virtual_machine_interface_back_refs']:
  vmi = controller.href(vmir['href'])['data']['virtual-machine-interface']
  ip  = controller.href(vmi['instance_ip_back_refs'][0]['href'])['data']['instance-ip']
  network = vmi['virtual_network_refs'][0]['to']
  network.reverse()
  record = {'mac_address':vmi['virtual_machine_interface_mac_addresses']['mac_address'][0],'routing-instance':vmi['routing_instance_refs'][0]['to'][3],'network_uuid':vmi['virtual_network_refs'][0]['uuid'],'network_fqdn':".".join(network),'ip_address':ip['instance_ip_address']}
  if vmi.get('floating_ip_back_refs'):
   fip = controller.href(vmi['floating_ip_back_refs'][0]['href'])['data']['floating-ip']
   record.update({'floating_ip_address':fip['floating_ip_address'],'floating_ip_name':fip['fq_name'][2],'floating_ip_uuid':fip['uuid']})
  ret['interfaces'].append(record)
 return ret
예제 #6
0
def heat_instantiate(aDict):
 """Function docstring for heat_instantiate TBD

 Args:
  - token (required)
  - template (required)
  - name (required)
  - parameters (required)

 Output:
 """
 ret = {}
 args = {}
 try:
  with open(ospath.abspath(ospath.join(SC['openstack']['heat_directory'],"%s.tmpl.json"%aDict['template']))) as f:
   args = loads(f.read())
  args['stack_name'] = aDict['name']
  for key,value in aDict['parameters'].iteritems():
   args['parameters'][key] = value
 except Exception as e:
  ret['info'] = str(e)
  ret['result'] = 'NOT_OK'
 else:
  with DB() as db:
   db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = 'heat'"%(aDict['token']))
   data = db.get_row()
  try:
   controller = Device(data['node'],aDict['token'])
   ret = controller.call(data['service_port'], data['service_url'] + "stacks", args, 'POST')
   ret['result'] = 'OK'
  except Exception as e: ret = e[0]
 return ret
예제 #7
0
def rest(aDict):
 """Function docstring for rest TBD

 Args:
  - token (required)
  - service (optional)
  - call (optional)
  - href (optional)
  - arguments (optional)
  - method (optional)

 Output:
 """
 try:
  if aDict.get('href'):
   ret = rest_call(aDict.get('href'), aDict.get('arguments'), aDict.get('method','GET'), { 'X-Auth-Token':aDict['token'] })
  else:
   with DB() as db:
    db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = '%s'"%(aDict['token'],aDict.get('service')))
    data = db.get_row()
   controller = Device(data['node'],aDict['token'])
   ret = controller.call(data['service_port'], data['service_url'] + aDict['call'], aDict.get('arguments'), aDict.get('method','GET'))
  ret['result'] = 'OK' if not ret.get('result') else ret.get('result')
 except Exception as e: ret = e[0]
 return ret
예제 #8
0
def contrail_fqname(aDict):
 """Function docstring for fqname TBD

 Args:
  - token (required)
  - uuid (required)

 Output:
 """
 with DB() as db:
  db.do("SELECT node FROM openstack_tokens WHERE token = '%s'"%aDict['token'])
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 try:
  ret = controller.call("8082","id-to-fqname",args={'uuid':aDict['uuid']},method='POST')
  ret['result'] = 'OK' if not ret.get('result') else ret.get('result')
 except Exception as e: ret = e[0]
 return ret
예제 #9
0
def contrail_uuid(aDict):
 """Function docstring for uuid_info TBD

 Args:
  - token (required)
  - uuid (required)

 Output:
 """
 with DB() as db:
  db.do("SELECT node FROM openstack_tokens WHERE token = '%s'"%aDict['token'])
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 try:
  res = controller.call("8082","id-to-fqname",args={'uuid':aDict['uuid']},method='POST')
  if res.get('result','OK') == 'OK':
   ret = controller.call("8082","%s/%s"%(res['data']['type'],aDict['uuid']))['data']
 except Exception as e: ret = e[0]
 return ret
예제 #10
0
def vm_resources(aDict):
 """Function docstring for vm_resources TBD

 Args:
  - token (required)

 Output:
 """
 ret = {}
 with DB() as db:
  db.do("SELECT node,id FROM openstack_tokens WHERE token = '%s'"%(aDict['token']))
  data = db.get_row()
  db.do("SELECT service,service_port,service_url FROM openstack_services WHERE id = '%s'"%(data['id']))
  services = db.get_dict('service')
 controller = Device(data['node'],aDict['token'])
 ret['flavors']  = controller.call(services['nova']['service_port'],services['nova']['service_url'] + "flavors/detail?sort_key=name")['data']['flavors']
 ret['images']   = controller.call(services['glance']['service_port'],services['glance']['service_url'] + "v2/images?sort=name:asc")['data']['images']
 ret['networks'] = controller.call(services['neutron']['service_port'],services['neutron']['service_url'] + "v2.0/networks?sort_key=name")['data']['networks']
 return ret
예제 #11
0
def contrail_vm_interfaces(aDict):
 """Function docstring for contrail_vm_interfaces TBD

 Args:
  - token (required)
  - vm (required)

 Output:
 """
 ret = {'vm':aDict['vm'],'interfaces':[]}
 with DB() as db:
  db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = 'contrail'"%(aDict['token']))
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 vmis = controller.call(data['service_port'],data['service_url'] + "virtual-machine/%s"%aDict['vm'])['data']['virtual-machine']['virtual_machine_interface_back_refs']
 for vmi in vmis:
  vmi = controller.href(vmi['href'])['data']['virtual-machine-interface']
  iip = controller.href(vmi['instance_ip_back_refs'][0]['href'])['data']['instance-ip']
  ret['interfaces'].append({'uuid':vmi['uuid'],'ip_address':iip['instance_ip_address'],'virtual_network':iip['virtual_network_refs'][0]['to'][2]})
 return ret
예제 #12
0
def contrail_interfaces(aDict):
 """Function docstring for contrail_interfaces TBD

 Args:
  - token (required)
  - virtual_network (required)

 Output:
 """
 ret = {'virtual-network':aDict['virtual_network'],'ip_addresses':[]}
 with DB() as db:
  db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = 'contrail'"%(aDict['token']))
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 res = controller.call(data['service_port'],data['service_url'] + "virtual-network/%s"%aDict['virtual_network'])
 vn = res['data']['virtual-network']
 fqdn = vn['fq_name']
 fqdn.reverse()
 ret['fqdn'] = ".".join(fqdn)
 ret['name'] = vn['name']
 for ip in vn.get('instance_ip_back_refs',[]):
  iip = controller.href(ip['href'])['data']['instance-ip']
  vmi = controller.href(iip['virtual_machine_interface_refs'][0]['href'])['data']['virtual-machine-interface']
  record = {'ip_address':iip['instance_ip_address'],'mac_address':vmi['virtual_machine_interface_mac_addresses']['mac_address'][0]}
  if vmi.get('virtual_machine_refs'):
   record['vm_uuid'] = vmi['virtual_machine_refs'][0]['uuid']
  if vmi.get('virtual_machine_interface_bindings'):
   host = vmi['virtual_machine_interface_bindings']['key_value_pair']
   for kvp in host:
    if kvp['key'] == 'host_id':
     record['vm_binding'] = kvp['value']
     break
  if vmi.get('logical_interface_back_refs'):
   li = vmi['logical_interface_back_refs'][0]
   record['logical_interface'] = li['to'][1] + "-" + li['to'][3]
   record['logical_interface_uuid'] = li['uuid']
  if vmi.get('virtual_machine_interface_device_owner'):
   record['vm_interface_owner'] = vmi['virtual_machine_interface_device_owner']
  ret['ip_addresses'].append(record)
 return ret
예제 #13
0
def call(aDict):
 """Function docstring for call. Basically creates a controller instance and send a (nested) rest_call.

 Args:
  - node (required)
  - token (required)
  - service (required)
  - call (required)
  - arguments (optional)
  - method (optional)

 Output:
 """
 with DB() as db:
  db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = '%s'"%(aDict['token'], aDict['service']))
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 try:
  ret = controller.call(data['service_port'], data['service_url'] + aDict.get('call',''), aDict.get('arguments'), aDict.get('method'))
  ret['result'] = 'OK' if not ret.get('result') else ret.get('result')
 except Exception as e: ret = e[0]
 return ret
예제 #14
0
def contrail_vm_associate_fip(aDict):
 """Function docstring for contrail_vm_interfaces TBD

 Args:
  - token (required)
  - vm_interface (required)
  - vm_ip_address (required)
  - floating_ip (required)
 Output:
 """
 ret = {}
 with DB() as db:
  db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = 'contrail'"%(aDict['token']))
  data = db.get_row()
 controller = Device(data['node'],aDict['token'])
 try:
  vmi = controller.call(data['service_port'],data['service_url'] + "virtual-machine-interface/%s"%aDict['vm_interface'])['data']['virtual-machine-interface']
  fip = { 'floating-ip':{ 'floating_ip_fixed_ip_address':aDict['vm_ip_address'], 'virtual_machine_interface_refs':[ {'href':vmi['href'],'attr':None,'uuid':vmi['uuid'],'to':vmi['fq_name'] } ] } }
  res = controller.call(data['service_port'],data['service_url'] +"floating-ip/%s"%aDict['floating_ip'],args=fip,method='PUT')
  ret['result'] = "OK" if res['code'] == 200 else "NOT_OK"
 except Exception as e:
  ret['result'] ='ERROR'
  ret['info'] = str(e)
 return ret