Skip to content

Commit d706ae6

Browse files
authored
Merge pull request #1737 from grycap/devel
Devel
2 parents 8d6e660 + 3d16e1e commit d706ae6

File tree

10 files changed

+87
-71
lines changed

10 files changed

+87
-71
lines changed

IM/CloudInfo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def get_cloud_list(auth_data):
9898
res = []
9999

100100
for i, auth in enumerate(auth_data.auth_list):
101-
if 'type' in auth and auth['type'] not in ['InfrastructureManager', 'VMRC', 'AppDBIS']:
101+
if 'type' in auth and auth['type'] not in ['InfrastructureManager', 'VMRC', 'AppDBIS', 'EGIIS']:
102102
cloud_item = CloudInfo()
103103
cloud_item.type = auth['type']
104104
if 'id' in auth.keys() and auth['id']:

IM/FedcloudInfo.py

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -187,26 +187,11 @@ def list_images(filters=None, do_order=True):
187187
if not filters:
188188
filters = {}
189189

190-
if "app" in filters:
191-
app = filters["app"]
192-
else:
193-
app = ""
194-
195-
if "distribution" in filters:
196-
distribution = filters["distribution"]
197-
else:
198-
distribution = ".*"
199-
200190
if "vo" in filters:
201191
vo = filters["vo"]
202192
else:
203193
vo = None
204194

205-
if "version" in filters:
206-
version = filters["version"]
207-
else:
208-
version = ".*"
209-
210195
params = {}
211196
if vo:
212197
params.update({"vo_name": vo})
@@ -216,22 +201,23 @@ def list_images(filters=None, do_order=True):
216201

217202
res = []
218203
for image in images:
219-
app_name_reg = r".*%s.* \[%s\/%s\/.*]" % (
220-
app.lower(),
221-
distribution.lower(),
222-
version,
223-
)
224-
if not re.search(app_name_reg, image["name"].lower()):
225-
continue
226-
227-
endpoint = urlparse(image["endpoint"])
228-
res.append(
229-
{
230-
"uri": "ost://%s/%s" % (endpoint[1], image["id"]),
231-
"name": image["name"],
232-
"vo": image["vo"],
233-
}
234-
)
204+
image_name = image["name"].lower()
205+
accept = True
206+
for elem in ["distribution", "version", "app"]:
207+
if filters.get(elem) and filters.get(elem).lower() not in image_name:
208+
accept = False
209+
break
210+
211+
if accept:
212+
endpoint = urlparse(image["endpoint"])
213+
res.append(
214+
{
215+
"uri": "ost://%s/%s" % (endpoint[1], image["id"]),
216+
"name": image["name"],
217+
"vo": image["vo"],
218+
}
219+
)
220+
235221
if vo and do_order:
236222
sites = FedcloudInfo.get_sites_supporting_vo(vo)
237223
if sites:

IM/InfrastructureManager.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ def search_vm(inf, radl_sys, auth):
417417
def systems_with_iis(sel_inf, radl, auth):
418418
"""
419419
Concrete systems using Image Information Systems.
420-
Currently supported VMRC and AppDBIS
420+
Currently supported VMRC and AppDBIS/EGIIS
421421
NOTE: consider not-fake deploys (vm_number > 0)
422422
"""
423423
# Get VMRC credentials
@@ -427,9 +427,12 @@ def systems_with_iis(sel_inf, radl, auth):
427427
vmrc_list.append(VMRC(vmrc_elem['host'], vmrc_elem['username'], vmrc_elem['password']))
428428

429429
# Get AppDBIS credentials
430-
appdbis_list = []
431-
for appdbis_elem in auth.getAuthInfo('AppDBIS'):
432-
appdbis_list.append(FedcloudInfo)
430+
egiis_list = []
431+
for _ in auth.getAuthInfo('AppDBIS'):
432+
egiis_list.append(FedcloudInfo)
433+
# Get EGIIS credentials
434+
for _ in auth.getAuthInfo('EGIIS'):
435+
egiis_list.append(FedcloudInfo)
433436

434437
systems_with_vmrc = {}
435438
for system_id in set([d.id for d in radl.deploys if d.vm_number > 0]):
@@ -455,22 +458,22 @@ def systems_with_iis(sel_inf, radl, auth):
455458
s_without_apps.addFeature(f)
456459

457460
vmrc_res = [s0 for vmrc in vmrc_list for s0 in vmrc.search_vm(s)]
458-
appdbis_res = [s0 for appdbis in appdbis_list for s0 in appdbis.search_vm(s)]
461+
egiis_res = [s0 for egiis in egiis_list for s0 in egiis.search_vm(s)]
459462
local_msg, local_res = InfrastructureManager.search_vm(sel_inf, s, auth)
460463
# Check that now the image URL is in the RADL
461-
if not s.getValue("disk.0.image.url") and not vmrc_res and not appdbis_res and not local_res:
464+
if not s.getValue("disk.0.image.url") and not vmrc_res and not egiis_res and not local_res:
462465
msg = "No VMI obtained from Sites"
463466
if vmrc_list:
464467
msg += " nor VMRC"
465-
if appdbis_list:
466-
msg += " nor AppDBIS"
468+
if egiis_list:
469+
msg += " nor EGI IS"
467470
msg += " to system '" + system_id + "'"
468471
if local_msg:
469472
msg += ": " + local_msg
470473
raise Exception(msg)
471474

472475
n = [s_without_apps.clone().applyFeatures(s0, conflict="other", missing="other")
473-
for s0 in (vmrc_res + appdbis_res + local_res)]
476+
for s0 in (vmrc_res + egiis_res + local_res)]
474477
systems_with_vmrc[system_id] = n if n else [s_without_apps]
475478

476479
return systems_with_vmrc

IM/connectors/CloudConnector.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,3 +819,13 @@ def convert_memory_unit(memory, unit="M"):
819819
if converted - int(converted) < 0.0000000000001:
820820
converted = int(converted)
821821
return converted
822+
823+
@staticmethod
824+
def loose_version_compare(user_version, system_version):
825+
pattern = r'^\d+(?:\.\d+){0,2}$'
826+
if re.match(pattern, user_version) and re.match(pattern, system_version):
827+
u = [int(x) for x in user_version.split(".")]
828+
s = [int(x) for x in system_version.split(".")]
829+
return s[:len(u)] == u
830+
else:
831+
return user_version == system_version

IM/connectors/OpenStack.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2164,7 +2164,7 @@ def _filter_images(self, image_list, filters=None):
21642164
if version is not None:
21652165
image_version = image.extra.get('os_version', None)
21662166
if image_version:
2167-
if version.lower() != image_version.lower():
2167+
if not self.loose_version_compare(version, image_version):
21682168
continue
21692169
elif version.lower() not in image.name.lower():
21702170
continue

doc/source/dashboard.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ How to deploy the dashboard
2626
Register a client in an OIDC server with the following properties:
2727

2828
- redirect uri: `https://<DASHBOARD_HOST>:<PORT>/login/oidc/authorized`
29-
- scopes: 'openid', 'email', 'profile', 'offline_access' ('eduperson_entitlement' in EGI Check-In optional)
29+
- scopes: 'openid', 'email', 'profile', 'offline_access' ('entitlements' in EGI Check-In optional)
3030
- introspection endpoint enabled
3131

3232
Create the `config.json` file (see the [example](app/config-sample.json)) setting the following variables:
@@ -441,4 +441,4 @@ show in :ref:`Fig. 15 <figure_dash_vm_resize>`.
441441
.. _figure_dash_vm_resize:
442442
.. figure:: images/dash_vm_resize.png
443443

444-
Fig 16. VM Resize modal form.
444+
Fig 16. VM Resize modal form.

doc/source/gstarted.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Cloud providers:
6262
* **aws://<region>/<ami-id>**, for Amazon Web Service;
6363
* **gce://<region>/<image-id>**, for Google Cloud;
6464
* **azr://<publisher>/<offer>/<sku>/<version>**, for Microsoft Azure; and
65-
* **appdb://<site_name>/<apc_name>?<vo_name>**, for EGI or OpenStack connector using AppDB info.
65+
* **egi://<site_name>/<apc_name>?<vo_name>**, for EGI or OpenStack connector using AppDB info.
6666
* **docker://<docker_image>**, for Docker images.
6767
* **fbw://<fns_server>/<image-id>**, for FogBow images.
6868
* **lin://linode/<image-id>**, for Linode images.

doc/source/radl.rst

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,13 +328,14 @@ machine. The supported features are:
328328
* ``aws://<region>/<snapshot-id>``, for Amazon Web Service;
329329
* ``aws://<region>/<snapshot-name>``, for Amazon Web Service;
330330
* ``gce://<region>/<image-id>``, for Google Cloud;
331-
* ``azr://<image-id>``, for Microsoft Azure Clasic;
332-
* ``azr://<publisher>/<offer>/<sku>/<version>``, for Microsoft Azure;
331+
* ``azr://<image-id>``, for Microsoft Azure Clasic (deprecated);
332+
* ``azr://[region]/<publisher>/<offer>/<sku>/<version>``, for Microsoft Azure;
333333
* ``azr://[snapshots|disk]/<rgname>/<diskname>``, for Microsoft Azure;
334334
* ``<fedcloud_endpoint_url>/<image_id>``, for FedCloud OCCI connector.
335335
* ``appdb://<site_name>/<apc_name>?<vo_name>``, for FedCloud OCCI, OpenStack or EGI connectors using AppDB info (from vers. 1.6.0, 1.8.6 and 1.10.2 respectively).
336-
In case of EGI connector the ``vo_name`` is not required as it will be get from auth data.
337-
* ``appdb://<apc_name>?<vo_name>``, for FedCloud OCCI, OpenStack or EGI connectors without setting site_name.
336+
In case of EGI connector the ``vo_name`` is not required as it will be get from auth data (deprecated use egi protocol instead).
337+
* ``appdb://<apc_name>?<vo_name>``, for FedCloud OCCI, OpenStack or EGI connectors without setting site_name (deprecated use egi protocol instead).
338+
* ``egi://<site_name>/<apc_name>?<vo_name>``, for OpenStack or EGI connectors using EGI IS info (from vers. 1.19.0).
338339
* ``docker://<docker_image>``, for Docker images.
339340
* ``fbw://<fns_server>/<image-id>``, for FogBow images.
340341
* ``lin://linode/<image-id>``, for Linode images.

test/unit/FedcloudInfo.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
sys.path.append("..")
1111
sys.path.append(".")
1212

13+
from radl.radl import system, Feature
1314
from IM.FedcloudInfo import FedcloudInfo
1415
from mock import patch, MagicMock
1516

@@ -58,21 +59,23 @@ def get_response(self, method, url, **kwargs):
5859
resp.status_code = 200
5960
resp.json.return_value = [
6061
{
61-
"egi_id": "egi.docker",
62-
"id": "image_id2",
62+
"egi_id": "egi_vm_images/docker:22.04",
63+
"id": "93759c63-b998-4222-84eb-5fa10af1113b",
6364
"endpoint": "https://keystone.recas.ba.infn.it/v3",
64-
"mpuri": "https://appdb.egi.eu/store/vo/image/0c0a1ffc-b936-5efd-920c-b648a02cccf4:13976/",
65-
"name": "EGI Docker",
66-
"version": "2023.09.19",
65+
"mpuri": ("registry.egi.eu/egi_vm_images/docker:22.04-sha256:"
66+
"09ef8b577905758d51bc2515f8bef89a9ee11202b64878bb59a02417b55c95ce"),
67+
"name": "registry.egi.eu egi_vm_images/docker:22.04",
68+
"version": "2025-10-07-fc45d0d3",
6769
"vo": "fedcloud.egi.eu",
6870
},
6971
{
70-
"egi_id": "egi.docker",
71-
"id": "image_id3",
72+
"egi_id": "egi_vm_images/ubuntu:24.04",
73+
"id": "8d4755c8-6157-4dd0-a60e-3f8cfbfcbc60",
7274
"endpoint": "https://keystone.recas.ba.infn.it/v3",
73-
"mpuri": "https://appdb.egi.eu/store/vo/image/0c0a1ffc-b936-5e66-920c-b648a02cccf4:13976/",
74-
"name": "EGI Docker",
75-
"version": "2023.09.01",
75+
"mpuri": ("registry.egi.eu/egi_vm_images/ubuntu:24.04-sha256:"
76+
"4bcb811d1fa2f53e794d9be240c36f004e45308128b2cba9e3a51a7975bd2359"),
77+
"name": "registry.egi.eu egi_vm_images/ubuntu:24.04",
78+
"version": "2025-10-07-fc45d0d3",
7679
"vo": "fedcloud.egi.eu",
7780
},
7881
]
@@ -88,17 +91,17 @@ def test_get_site_url(self, requests):
8891
def test_get_image_id(self, requests):
8992
requests.side_effect = self.get_response
9093
res = FedcloudInfo.get_image_id(
91-
"INFN-CLOUD-BARI", "egi.docker", "fedcloud.egi.eu"
94+
"INFN-CLOUD-BARI", "egi_vm_images/ubuntu:24.04", "fedcloud.egi.eu"
9295
)
93-
self.assertEqual(res, "image_id2")
96+
self.assertEqual(res, "8d4755c8-6157-4dd0-a60e-3f8cfbfcbc60")
9497

9598
@patch("requests.request")
9699
def test_get_image_data(self, requests):
97100
requests.side_effect = self.get_response
98-
str_url = "egi://INFN-CLOUD-BARI/egi.docker?fedcloud.egi.eu"
101+
str_url = "egi://INFN-CLOUD-BARI/egi_vm_images/ubuntu:24.04?fedcloud.egi.eu"
99102
site_url, image_id, _ = FedcloudInfo.get_image_data(str_url)
100103
self.assertEqual(site_url, "https://keystone.recas.ba.infn.it")
101-
self.assertEqual(image_id, "image_id2")
104+
self.assertEqual(image_id, "8d4755c8-6157-4dd0-a60e-3f8cfbfcbc60")
102105

103106
@patch("requests.request")
104107
def test_get_project_ids(self, requests):
@@ -107,3 +110,16 @@ def test_get_project_ids(self, requests):
107110
self.assertEqual(
108111
projects, {"ops": "projectid1", "vo.access.egi.eu": "projectid2"}
109112
)
113+
114+
@patch("requests.request")
115+
def test_search_vm(self, requests):
116+
radl_system = system("s0", [Feature("disk.0.os.name", "=", "linux"),
117+
Feature("disk.0.os.flavour", "=", "ubuntu"),
118+
Feature("disk.0.os.version", "=", "24.04")])
119+
requests.side_effect = self.get_response
120+
res = FedcloudInfo.search_vm(radl_system)
121+
122+
self.assertEqual(len(res), 1)
123+
self.assertEqual(res[0].getValue("disk.0.image.url"),
124+
"ost://keystone.recas.ba.infn.it/8d4755c8-6157-4dd0-a60e-3f8cfbfcbc60")
125+
self.assertEqual(res[0].getValue("disk.0.image.vo"), "fedcloud.egi.eu")

test/unit/test_im_logic.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,9 +1407,9 @@ def test_get_cloud_info(self, appdbis):
14071407

14081408
@patch('IM.InfrastructureManager.VMRC')
14091409
@patch('IM.InfrastructureManager.FedcloudInfo')
1410-
def test_systems_with_iis(self, appdbis, vmrc):
1410+
def test_systems_with_iis(self, egiis, vmrc):
14111411
auth = self.getAuth([0], [0])
1412-
auth.auth_list.append({"type": "AppDBIS", "host": "http://is.marie.hellasgrid.gr"})
1412+
auth.auth_list.append({"type": "EGIIS", "host": "https://is.cloud.egi.eu"})
14131413
radl = RADL()
14141414
radl.add(system("s0", [Feature("disk.0.os.name", "=", "linux"),
14151415
Feature("disk.0.os.flavour", "=", "ubuntu"),
@@ -1418,13 +1418,13 @@ def test_systems_with_iis(self, appdbis, vmrc):
14181418
inf = InfrastructureInfo()
14191419
inf.id = "1"
14201420

1421-
sys_appdb = system("s0", [Feature("disk.0.os.name", "=", "linux"),
1422-
Feature("disk.0.os.flavour", "=", "ubuntu"),
1423-
Feature("disk.0.os.version", "=", "18.04"),
1424-
Feature("disk.0.image.url", "=", "https://fedcloud.eu"),
1425-
Feature("disk.0.image.vo", "=", "fedcloud.egi.eu")])
1421+
sys_egi = system("s0", [Feature("disk.0.os.name", "=", "linux"),
1422+
Feature("disk.0.os.flavour", "=", "ubuntu"),
1423+
Feature("disk.0.os.version", "=", "18.04"),
1424+
Feature("disk.0.image.url", "=", "https://fedcloud.eu"),
1425+
Feature("disk.0.image.vo", "=", "fedcloud.egi.eu")])
14261426

1427-
appdbis.search_vm.return_value = [sys_appdb]
1427+
egiis.search_vm.return_value = [sys_egi]
14281428

14291429
sys_vmrc = system("s0", [Feature("disk.0.os.name", "=", "linux"),
14301430
Feature("disk.0.os.flavour", "=", "ubuntu"),

0 commit comments

Comments
 (0)