Revision f15bf3d9 snf-cyclades-app/synnefo/logic/backend_allocator.py
b/snf-cyclades-app/synnefo/logic/backend_allocator.py | ||
---|---|---|
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): |
Also available in: Unified diff