163 lines
5.0 KiB
Python
163 lines
5.0 KiB
Python
# Copyright 2015 Spanish National Research Council
|
|
# Copyright 2015 LIP - INDIGO-DataCloud
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from ooi.occi import helpers
|
|
|
|
_PREFIX = "http://schemas.openstack.org/"
|
|
PUBLIC_NETWORK = "PUBLIC"
|
|
|
|
|
|
def build_scheme(category):
|
|
return helpers.build_scheme(category, prefix=_PREFIX)
|
|
|
|
|
|
def vm_state(nova_status):
|
|
if nova_status == "ACTIVE":
|
|
return "active"
|
|
elif nova_status == "SUSPENDED":
|
|
return "suspended"
|
|
else:
|
|
return "inactive"
|
|
|
|
|
|
# TODO(enolfc): Do really implement this.
|
|
def vol_state(nova_status):
|
|
return "online"
|
|
|
|
|
|
def network_status(neutron_status):
|
|
"""Translate neutron network status.
|
|
|
|
:param neutron_status: neutron status
|
|
"""
|
|
if neutron_status == "ACTIVE":
|
|
return "active"
|
|
else:
|
|
return "inactive"
|
|
|
|
|
|
def security_group_rule_type(neutron_type):
|
|
"""Translate neutron rule type.
|
|
|
|
Translate to/from openstack - occi
|
|
|
|
:param neutron_type: neutron status
|
|
"""
|
|
if neutron_type == "ingress":
|
|
return "inbound"
|
|
elif neutron_type == "egress":
|
|
return "outbound"
|
|
elif neutron_type == "inbound":
|
|
return "ingress"
|
|
elif neutron_type == "outbound":
|
|
return "egress"
|
|
else:
|
|
return None
|
|
|
|
|
|
def security_group_rule_port(os_port):
|
|
"""Translate openstack rule port
|
|
|
|
Translate to/from openstack - occi
|
|
|
|
:param neutron_type: neutron status
|
|
"""
|
|
ports = str(os_port).split('-')
|
|
if ports.__len__() == 1:
|
|
port_min = port_max = ports[0]
|
|
elif ports.__len__() == 2:
|
|
port_min, port_max = ports
|
|
else:
|
|
raise Exception("Port value")
|
|
return port_min, port_max
|
|
|
|
|
|
def build_security_group_from_neutron(sec_groups):
|
|
"""Translate neutron security group
|
|
|
|
Translate to the ooi a standard security group format.
|
|
|
|
:param sec_groups: array of security groups
|
|
"""
|
|
sec_list = []
|
|
for sec in sec_groups:
|
|
ooi_sec = {}
|
|
rules_list = []
|
|
ooi_sec["id"] = sec["id"]
|
|
ooi_sec["title"] = sec.get("name", None)
|
|
ooi_sec["summary"] = sec.get("description", "")
|
|
for rule in sec["security_group_rules"]:
|
|
ipversion = rule.get("ethertype", "IPv4")
|
|
rule_type = security_group_rule_type(
|
|
rule["direction"]
|
|
)
|
|
rule_protocol = rule.get("protocol", None)
|
|
port_min = rule["port_range_min"]
|
|
port_max = rule["port_range_max"]
|
|
if port_min and (port_min != port_max):
|
|
rule_port = "%s-%s" % (port_min,
|
|
port_max
|
|
)
|
|
else:
|
|
rule_port = port_min
|
|
rule_range = str(rule["remote_ip_prefix"])
|
|
rules_list.append({"type": rule_type,
|
|
"protocol": rule_protocol,
|
|
"port": rule_port,
|
|
"range": rule_range,
|
|
"ipversion": ipversion}
|
|
)
|
|
ooi_sec["rules"] = rules_list
|
|
sec_list.append(ooi_sec)
|
|
return sec_list
|
|
|
|
|
|
def build_security_group_from_nova(sec_groups):
|
|
"""Translate nova security group
|
|
|
|
Translate to the ooi a standard security group format.
|
|
|
|
:param sec_groups: array of security groups
|
|
"""
|
|
sec_list = []
|
|
for sec in sec_groups:
|
|
ooi_sec = {}
|
|
rules_list = []
|
|
ooi_sec["id"] = sec["id"]
|
|
ooi_sec["title"] = sec.get("name", None)
|
|
ooi_sec["summary"] = sec.get("description", "")
|
|
for rule in sec["rules"]:
|
|
ipversion = "IPv4"
|
|
rule_protocol = rule.get("ip_protocol", None)
|
|
port_min = rule["from_port"]
|
|
port_max = rule["to_port"]
|
|
if port_min and (port_min != port_max):
|
|
rule_port = "%s-%s" % (port_min,
|
|
port_max
|
|
)
|
|
else:
|
|
rule_port = port_min
|
|
rule_range = str(rule["ip_range"].get("cidr", ""))
|
|
# BUG(jorgesce): type is alwayns inbound because nova
|
|
# does not provide that information.
|
|
rules_list.append({"type": "inbound",
|
|
"protocol": rule_protocol,
|
|
"port": rule_port,
|
|
"range": rule_range,
|
|
"ipversion": ipversion}
|
|
)
|
|
ooi_sec["rules"] = rules_list
|
|
sec_list.append(ooi_sec)
|
|
return sec_list |