Merge "Bottlenecks POSCA testing code reconstruction"
[bottlenecks.git] / utils / infra_setup / runner / stack.py
diff --git a/utils/infra_setup/runner/stack.py b/utils/infra_setup/runner/stack.py
new file mode 100644 (file)
index 0000000..fb78c36
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''This file realize the function of use config to be born with a template
+a template is use to create a stack in openstack.
+This file will be amended in the furture.'''
+
+import utils.infra_setup.heat.template as Heat
+
+class stack_api():
+
+    def from_config_template(stack_info):
+        stack_name = stack_info['name']
+        ext_gw_net = os.environ.get("EXTERNAL_NETWORK")
+        heat_parser = HeatTemplate_Parser()
+        heat_parser.add_security_group(stack_name)
+        heat_parser.add_keypair(stack_name)
+        for network in stack_info['networks']:
+            heat_parser.add_network(stack_name)
+            heat_parser.add_subnet(stack_name,
+                                   stack_info['networks'][network]['cidr'])
+
+            heat_parser.add_router(stack_name, ext_gw_net)
+            heat_parser.add_router_interface(stack_name)
+
+        for server in stack_info['servers']:
+            heat_parser.add_port(server, stack_name)
+            heat_parser.add_floating_ip(server, stack_name, ext_gw_net)
+            heat_parser.add_floating_ip_ass(server)
+            heat_parser.add_server(server,
+                                   stack_info['servers'][server]['image'],
+                                   stack_info['servers'][server]['flavor'],
+                                   stack_info['servers'][server]['user'])
+
+        template = heat_parser.get_template_date()
+        stack = Heat.HeatTemplate(name=stack_name, heat_template=template)
+        try:
+            self.stack = stack.create()
+        except KeyboardInterrupt:
+            sys.exit("\nStack create interrupted")
+        except RuntimeError as err:
+            sys.exit("error: failed to deploy stack: '%s'" % err.args)
+        except Exception as err:
+            sys.exit("error: failed to deploy stack: '%s'" % err)
+
+        for server in stack_info['servers']:
+            if len(server.ports) > 0:
+                # TODO(hafe) can only handle one internal network for now
+                port = list(server.ports.values())[0]
+                server.private_ip = self.stack.outputs[port["stack_name"]]
+
+            if server.floating_ip:
+                server.public_ip = \
+                    self.stack.outputs[server.floating_ip["stack_name"]]
+