Skip to content

Commit eb466aa

Browse files
Add distro validation for osm-arc (Azure#50)
* Add distro validation for osm-arc * fixed indentation * Fix linting * Resolve comments * Add unit test * fix lint Co-authored-by: Jonathan Innis <[email protected]>
1 parent 590e642 commit eb466aa

File tree

4 files changed

+106
-7
lines changed

4 files changed

+106
-7
lines changed

src/k8s-extension/HISTORY.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ Release History
77
++++++++++++++++++
88
* Add SSL support for AzureML
99

10-
1110
0.4.2
1211
++++++++++++++++++
1312

src/k8s-extension/azext_k8s_extension/partner_extensions/OpenServiceMesh.py

Lines changed: 81 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,36 @@
55

66
# pylint: disable=unused-argument
77

8-
from azure.cli.core.azclierror import InvalidArgumentValueError, RequiredArgumentMissingError
98
from knack.log import get_logger
109

11-
from ..vendored_sdks.models import ExtensionInstance
12-
from ..vendored_sdks.models import ExtensionInstanceUpdate
13-
from ..vendored_sdks.models import ScopeCluster
14-
from ..vendored_sdks.models import Scope
10+
from azure.cli.core.azclierror import InvalidArgumentValueError, RequiredArgumentMissingError
11+
from azure.cli.core.commands.client_factory import get_subscription_id
12+
13+
from pyhelm.chartbuilder import ChartBuilder
14+
from pyhelm.repo import VersionError
15+
from packaging import version
16+
import yaml
17+
18+
from ..partner_extensions import PartnerExtensionModel
1519

1620
from .PartnerExtensionModel import PartnerExtensionModel
1721

22+
from ..vendored_sdks.models import (
23+
ExtensionInstance,
24+
ExtensionInstanceUpdate,
25+
ScopeCluster,
26+
Scope
27+
)
28+
29+
from .._client_factory import cf_resources
30+
1831
logger = get_logger(__name__)
1932

2033

2134
class OpenServiceMesh(PartnerExtensionModel):
35+
CHART_NAME = "osm-arc"
36+
CHART_LOCATION = "https://azure.github.io/osm-azure"
37+
2238
def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_type, extension_type,
2339
scope, auto_upgrade_minor_version, release_train, version, target_namespace,
2440
release_namespace, configuration_settings, configuration_protected_settings,
@@ -62,6 +78,9 @@ def Create(self, cmd, client, resource_group_name, cluster_name, name, cluster_t
6278

6379
# NOTE-2: Return a valid ExtensionInstance object, Instance name and flag for Identity
6480
create_identity = False
81+
82+
_validate_tested_distro(cmd, resource_group_name, cluster_name, version)
83+
6584
extension_instance = ExtensionInstance(
6685
extension_type=extension_type,
6786
auto_upgrade_minor_version=auto_upgrade_minor_version,
@@ -93,3 +112,60 @@ def Update(self, extension, auto_upgrade_minor_version, release_train, version):
93112
release_train=release_train,
94113
version=version
95114
)
115+
116+
117+
def _validate_tested_distro(cmd, cluster_resource_group_name, cluster_name, extension_version):
118+
119+
field_unavailable_error = '\"testedDistros\" field unavailable for version {0} of microsoft.openservicemesh, ' \
120+
'cannot determine if this Kubernetes distribution has been properly tested'.format(extension_version)
121+
122+
if version.parse(str(extension_version)) <= version.parse("0.8.3"):
123+
logger.warning(field_unavailable_error)
124+
return
125+
126+
subscription_id = get_subscription_id(cmd.cli_ctx)
127+
resources = cf_resources(cmd.cli_ctx, subscription_id)
128+
129+
cluster_resource_id = '/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Kubernetes' \
130+
'/connectedClusters/{2}'.format(subscription_id, cluster_resource_group_name, cluster_name)
131+
132+
resource = resources.get_by_id(cluster_resource_id, '2020-01-01-preview')
133+
cluster_distro = resource.properties['distribution'].lower()
134+
135+
if cluster_distro == "general":
136+
logger.warning('Unable to determine if distro has been tested for microsoft.openservicemesh, '
137+
'kubernetes distro: \"general\"')
138+
return
139+
140+
tested_distros = _get_tested_distros(extension_version)
141+
142+
if tested_distros is None:
143+
logger.warning(field_unavailable_error)
144+
elif cluster_distro not in tested_distros.split():
145+
logger.warning('Untested kubernetes distro for microsoft.openservicemesh, Kubernetes distro is %s',
146+
cluster_distro)
147+
148+
149+
def _get_tested_distros(chart_version):
150+
151+
try:
152+
chart_arc = ChartBuilder({
153+
"name": OpenServiceMesh.CHART_NAME,
154+
"version": str(chart_version),
155+
"source": {
156+
"type": "repo",
157+
"location": OpenServiceMesh.CHART_LOCATION
158+
}
159+
})
160+
except VersionError:
161+
raise InvalidArgumentValueError(
162+
"Invalid version '{}' for microsoft.openservicemesh".format(chart_version)
163+
)
164+
165+
values = chart_arc.get_values()
166+
values_yaml = yaml.load(values.raw, Loader=yaml.FullLoader)
167+
168+
try:
169+
return values_yaml['OpenServiceMesh']['testedDistros']
170+
except KeyError:
171+
return None
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# --------------------------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for license information.
4+
# --------------------------------------------------------------------------------------------
5+
6+
# pylint: disable=protected-access
7+
8+
import os
9+
import unittest
10+
11+
from azext_k8s_extension.partner_extensions.OpenServiceMesh import _get_tested_distros
12+
from azure.cli.core.azclierror import InvalidArgumentValueError
13+
14+
TEST_DIR = os.path.abspath(os.path.join(os.path.abspath(__file__), '..'))
15+
16+
class TestOpenServiceMesh(unittest.TestCase):
17+
def test_bad_osm_arc_version(self):
18+
version = "0.7.1"
19+
err = "Invalid version \'" + str(version) + "\' for microsoft.openservicemesh"
20+
with self.assertRaises(InvalidArgumentValueError) as argError:
21+
_get_tested_distros(version)
22+
self.assertEqual(str(argError.exception), err)

src/k8s-extension/setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
]
3131

3232
# TODO: Add any additional SDK dependencies here
33-
DEPENDENCIES = []
33+
DEPENDENCIES = [
34+
'pyhelm'
35+
]
3436

3537
VERSION = "0.4.3"
3638

0 commit comments

Comments
 (0)