ooi/ooi/openstack/helpers.py

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