summaryrefslogtreecommitdiffstats
path: root/fuel/deploy/cloud/deploy.py
blob: 1534f0b35e4b7b25111de7b2dfe875be35f528ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
###############################################################################
# Copyright (c) 2015 Ericsson AB and others.
# szilard.cserey@ericsson.com
# 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
###############################################################################


import os
import yaml
import io
import glob

import common
from dea import DeploymentEnvironmentAdapter
from configure_environment import ConfigureEnvironment
from deployment import Deployment

YAML_CONF_DIR = '/var/lib/opnfv'

N = common.N
E = common.E
R = common.R
RO = common.RO
exec_cmd = common.exec_cmd
parse = common.parse
err = common.err
check_file_exists = common.check_file_exists
log = common.log
commafy = common.commafy
ArgParser = common.ArgParser


class Deploy(object):

    def __init__(self, dea_file, blade_node_file, plugins_dir,
                 no_health_check):
        self.dea = DeploymentEnvironmentAdapter(dea_file)
        self.blade_node_file = blade_node_file
        self.plugins_dir = plugins_dir
        self.no_health_check = no_health_check
        self.macs_per_blade = {}
        self.blades = self.dea.get_node_ids()
        self.blade_node_dict = {}
        self.node_roles_dict = {}
        self.env_id = None
        self.wanted_release = self.dea.get_property('wanted_release')

    def get_blade_node_mapping(self):
        with io.open(self.blade_node_file, 'r') as stream:
            self.blade_node_dict = yaml.load(stream)

    def assign_roles_to_cluster_node_ids(self):
        self.node_roles_dict = {}
        for blade, node in self.blade_node_dict.iteritems():
            roles = commafy(self.dea.get_node_role(blade))
            self.node_roles_dict[node] = (roles, blade)

    def configure_environment(self):
        release_list = parse(exec_cmd('fuel release -l'))
        for release in release_list:
            if release[R['name']] == self.wanted_release:
                break
        config_env = ConfigureEnvironment(self.dea, YAML_CONF_DIR,
                                          release[R['id']],
                                          self.node_roles_dict)
        config_env.configure_environment()
        self.env_id = config_env.env_id

    def deploy_cloud(self):
        dep = Deployment(self.dea, YAML_CONF_DIR, self.env_id,
                         self.node_roles_dict, self.no_health_check)
        dep.deploy()

    def install_plugins(self):
        log('Installing Fuel Plugins')
        if self.plugins_dir and os.path.isdir(self.plugins_dir):
            for f in glob.glob('%s/*.rpm' % self.plugins_dir):
                log('Found plugin %s, installing ...' % f)
                r, c = exec_cmd('fuel plugins --install %s' % f, False)
                if c > 0 and 'does not update installed package' not in r:
                    err('Installation of Fuel Plugin %s failed' % f)

    def deploy(self):

        self.install_plugins()

        self.get_blade_node_mapping()

        self.assign_roles_to_cluster_node_ids()

        self.configure_environment()

        self.deploy_cloud()


def parse_arguments():
    parser = ArgParser(prog='python %s' % __file__)
    parser.add_argument('-nh', dest='no_health_check', action='store_true',
                        default=False,
                        help='Don\'t run health check after deployment')
    parser.add_argument('dea_file', action='store',
                        help='Deployment Environment Adapter: dea.yaml')
    parser.add_argument('blade_node_file', action='store',
                        help='Blade Node mapping: blade_node.yaml')
    parser.add_argument('plugins_dir', nargs='?', action='store',
                        help='Plugins directory')
    args = parser.parse_args()
    check_file_exists(args.dea_file)
    check_file_exists(args.blade_node_file)
    return (args.dea_file, args.blade_node_file, args.plugins_dir,
            args.no_health_check)


def main():

    dea_file, blade_node_file, plugins_dir, no_health_check = parse_arguments()

    deploy = Deploy(dea_file, blade_node_file, plugins_dir, no_health_check)
    deploy.deploy()

if __name__ == '__main__':
    main()