32 |
32 |
from django.utils import importlib
|
33 |
33 |
|
34 |
34 |
from synnefo.settings import (BACKEND_ALLOCATOR_MODULE, BACKEND_REFRESH_MIN,
|
35 |
|
BACKEND_PER_USER, ARCHIPELAGO_BACKENDS,
|
|
35 |
BACKEND_PER_USER,
|
36 |
36 |
DEFAULT_INSTANCE_NETWORKS)
|
37 |
37 |
from synnefo.db.models import Backend
|
38 |
38 |
from synnefo.logic.backend import update_backend_resources
|
... | ... | |
72 |
72 |
log.debug("Allocating VM: %r", vm)
|
73 |
73 |
|
74 |
74 |
# Get available backends
|
75 |
|
available_backends = get_available_backends()
|
|
75 |
available_backends = get_available_backends(flavor)
|
76 |
76 |
|
77 |
|
# Temporary fix for distinquishing archipelagos capable backends
|
78 |
|
available_backends = filter_archipelagos_backends(available_backends,
|
79 |
|
flavor.disk_template)
|
80 |
77 |
# Refresh backends, if needed
|
81 |
78 |
refresh_backends_stats(available_backends)
|
82 |
79 |
|
... | ... | |
96 |
93 |
return backend
|
97 |
94 |
|
98 |
95 |
|
99 |
|
def get_available_backends():
|
100 |
|
"""Get available backends from db.
|
|
96 |
def get_available_backends(flavor):
|
|
97 |
"""Get the list of available backends that can host a new VM of a flavor.
|
|
98 |
|
|
99 |
The list contains the backends that are online and that have enabled
|
|
100 |
the disk_template of the new VM.
|
|
101 |
|
|
102 |
Also, if the new VM will be automatically connected to a public network,
|
|
103 |
the backends that do not have an available public IPv4 address are
|
|
104 |
excluded.
|
101 |
105 |
|
102 |
106 |
"""
|
103 |
|
backends = list(Backend.objects.select_for_update().filter(drained=False,
|
104 |
|
offline=False))
|
|
107 |
backends = Backend.objects.select_for_update()
|
|
108 |
backends = backends.filter(offline=False, drained=False,
|
|
109 |
disk_templates__contains=flavor.disk_template)
|
|
110 |
backends = list(backends)
|
105 |
111 |
if "SNF:ANY_PUBLIC" in DEFAULT_INSTANCE_NETWORKS:
|
106 |
112 |
backends = filter(lambda x: has_free_ip(x), backends)
|
107 |
113 |
return backends
|
108 |
114 |
|
109 |
115 |
|
110 |
|
def filter_archipelagos_backends(available_backends, disk_template):
|
111 |
|
if disk_template == "ext":
|
112 |
|
available_backends = filter(lambda x: x.id in ARCHIPELAGO_BACKENDS,
|
113 |
|
available_backends)
|
114 |
|
else:
|
115 |
|
available_backends = filter(lambda x: x.id not in ARCHIPELAGO_BACKENDS,
|
116 |
|
available_backends)
|
117 |
|
return available_backends
|
118 |
|
|
119 |
|
|
120 |
116 |
def has_free_ip(backend):
|
121 |
117 |
"""Find if Backend has any free public IP."""
|
122 |
118 |
for network in backend_public_networks(backend):
|