File: provIpAmazon.py

package info (click to toggle)
opensvc 1.8~20170412-3
  • links: PTS
  • area: main
  • in suites: buster
  • size: 6,492 kB
  • ctags: 7,845
  • sloc: python: 77,169; sh: 339; xml: 39; makefile: 7
file content (91 lines) | stat: -rw-r--r-- 3,348 bytes parent folder | download
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
from provisioning import Provisioning
import rcExceptions as ex
from svcBuilder import conf_get_string_scope

class ProvisioningIp(Provisioning):
    def __init__(self, r):
        Provisioning.__init__(self, r)

    def provisioner(self):
        self.provisioner_private()
        self.provisioner_public()
        self.provisioner_docker_ip()
        self.cascade_allocation()
        self.r.log.info("provisioned")
        self.r.start()
        return True

    def cascade_allocation(self):
        if not self.r.svc.config.has_option(self.r.rid, "cascade_allocation"):
            return
        cascade = self.r.svc.config.get(self.r.rid, "cascade_allocation").split()
        need_write = False
        for e in cascade:
            try:
                rid, param = e.split(".")
            except:
                self.r.log.warning("misformatted cascade entry: %s (expected <rid>.<param>[@<scope>])" % e)
                continue
            if not self.r.svc.config.has_section(rid):
                self.r.log.warning("misformatted cascade entry: %s (rid does not exist)" % e)
                continue
            need_write = True
            self.r.log.info("cascade %s to %s" % (self.r.ipname, e))
            self.r.svc.config.set(rid, param, self.r.ipname)
            self.r.svc.resources_by_id[rid].ipname = conf_get_string_scope(self.r.svc, self.r.svc.config, rid, param)
            self.r.svc.resources_by_id[rid].addr = self.r.svc.resources_by_id[rid].ipname
        if need_write:
            self.r.svc.write_config()

    def provisioner_docker_ip(self):
        if not self.r.svc.config.has_option(self.r.rid, "docker_daemon_ip"):
            return
        if not self.r.svc.config.get(self.r.rid, "docker_daemon_ip"):
            return
        try:
            args = self.r.svc.config.get("DEFAULT", "docker_daemon_args")
        except:
            args = ""
        args += " --ip "+self.r.ipname
        self.r.svc.config.set("DEFAULT", "docker_daemon_args", args)
        self.r.svc.write_config()
        for r in self.r.svc.get_resources("container.docker"):
            # reload docker dameon args
            r.on_add()

    def provisioner_private(self):
        if self.r.ipname != "<allocate>":
            self.r.log.info("private ip already provisioned")
            return

        eni = self.r.get_network_interface()
        if eni is None:
            raise ex.excError("could not find ec2 network interface for %s" % self.ipdev)

        ips1 = set(self.r.get_instance_private_addresses())
        data = self.r.aws([
          "ec2", "assign-private-ip-addresses",
          "--network-interface-id", eni,
          "--secondary-private-ip-address-count", "1"
        ])
        ips2 = set(self.r.get_instance_private_addresses())
        new_ip = list(ips2 - ips1)[0]

        self.r.svc.config.set(self.r.rid, "ipname", new_ip)
        self.r.svc.write_config()
        self.r.ipname = new_ip

    def provisioner_public(self):
        if self.r.eip != "<allocate>":
            self.r.log.info("public ip already provisioned")
            return

        data = self.r.aws([
          "ec2", "allocate-address",
          "--domain", "vpc",
        ])

        self.r.svc.config.set(self.r.rid, "eip", data["PublicIp"])
        self.r.svc.write_config()
        self.r.eip = data["PublicIp"]