Skip to content

Commit 2a6ce0c

Browse files
vits-hugsVitor Hugo Homem Marzarottohsato03
authored
Adds url kubernetes iso (#10862)
Co-authored-by: Vitor Hugo Homem Marzarotto <vitor.marzarotto@scclouds.com.br> Co-authored-by: Henrique Sato <henriquesato2003@gmail.com>
1 parent 42f1e19 commit 2a6ce0c

File tree

8 files changed

+105
-31
lines changed

8 files changed

+105
-31
lines changed

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,6 +1097,7 @@ public class ApiConstants {
10971097
public static final String DOCKER_REGISTRY_EMAIL = "dockerregistryemail";
10981098
public static final String ISO_NAME = "isoname";
10991099
public static final String ISO_STATE = "isostate";
1100+
public static final String ISO_URL = "isourl";
11001101
public static final String SEMANTIC_VERSION = "semanticversion";
11011102
public static final String KUBERNETES_VERSION_ID = "kubernetesversionid";
11021103
public static final String KUBERNETES_VERSION_NAME = "kubernetesversionname";

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/version/KubernetesVersionManagerImpl.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.cloud.storage.dao.VMTemplateZoneDao;
5454
import com.cloud.template.TemplateApiService;
5555
import com.cloud.template.VirtualMachineTemplate;
56+
import com.cloud.user.Account;
5657
import com.cloud.user.AccountManager;
5758
import com.cloud.utils.Pair;
5859
import com.cloud.utils.component.ComponentContext;
@@ -85,7 +86,7 @@ public class KubernetesVersionManagerImpl extends ManagerBase implements Kuberne
8586
public static final String MINIMUN_AUTOSCALER_SUPPORTED_VERSION = "1.15.0";
8687

8788
protected void updateTemplateDetailsInKubernetesSupportedVersionResponse(
88-
final KubernetesSupportedVersion kubernetesSupportedVersion, KubernetesSupportedVersionResponse response) {
89+
final KubernetesSupportedVersion kubernetesSupportedVersion, KubernetesSupportedVersionResponse response, boolean isRootAdmin) {
8990
TemplateJoinVO template = templateJoinDao.findById(kubernetesSupportedVersion.getIsoId());
9091
if (template == null) {
9192
return;
@@ -95,11 +96,14 @@ protected void updateTemplateDetailsInKubernetesSupportedVersionResponse(
9596
if (template.getState() != null) {
9697
response.setIsoState(template.getState().toString());
9798
}
99+
if (isRootAdmin) {
100+
response.setIsoUrl(template.getUrl());
101+
}
98102
response.setIsoArch(template.getArch().getType());
99103
response.setDirectDownload(template.isDirectDownload());
100104
}
101105

102-
private KubernetesSupportedVersionResponse createKubernetesSupportedVersionResponse(final KubernetesSupportedVersion kubernetesSupportedVersion) {
106+
private KubernetesSupportedVersionResponse createKubernetesSupportedVersionResponse(final KubernetesSupportedVersion kubernetesSupportedVersion, boolean isRootAdmin) {
103107
KubernetesSupportedVersionResponse response = new KubernetesSupportedVersionResponse();
104108
response.setObjectName("kubernetessupportedversion");
105109
response.setId(kubernetesSupportedVersion.getUuid());
@@ -118,16 +122,19 @@ private KubernetesSupportedVersionResponse createKubernetesSupportedVersionRespo
118122
response.setSupportsHA(compareSemanticVersions(kubernetesSupportedVersion.getSemanticVersion(),
119123
KubernetesClusterService.MIN_KUBERNETES_VERSION_HA_SUPPORT)>=0);
120124
response.setSupportsAutoscaling(versionSupportsAutoscaling(kubernetesSupportedVersion));
121-
updateTemplateDetailsInKubernetesSupportedVersionResponse(kubernetesSupportedVersion, response);
125+
updateTemplateDetailsInKubernetesSupportedVersionResponse(kubernetesSupportedVersion, response, isRootAdmin);
122126
response.setCreated(kubernetesSupportedVersion.getCreated());
123127
return response;
124128
}
125129

126130
private ListResponse<KubernetesSupportedVersionResponse> createKubernetesSupportedVersionListResponse(
127131
List<KubernetesSupportedVersionVO> versions, Integer count) {
128132
List<KubernetesSupportedVersionResponse> responseList = new ArrayList<>();
133+
Account caller = CallContext.current().getCallingAccount();
134+
boolean isRootAdmin = accountManager.isRootAdmin(caller.getId());
135+
129136
for (KubernetesSupportedVersionVO version : versions) {
130-
responseList.add(createKubernetesSupportedVersionResponse(version));
137+
responseList.add(createKubernetesSupportedVersionResponse(version, isRootAdmin));
131138
}
132139
ListResponse<KubernetesSupportedVersionResponse> response = new ListResponse<>();
133140
response.setResponses(responseList, count);
@@ -374,7 +381,7 @@ public KubernetesSupportedVersionResponse addKubernetesSupportedVersion(final Ad
374381
supportedVersionVO = kubernetesSupportedVersionDao.persist(supportedVersionVO);
375382
CallContext.current().putContextParameter(KubernetesSupportedVersion.class, supportedVersionVO.getUuid());
376383

377-
return createKubernetesSupportedVersionResponse(supportedVersionVO);
384+
return createKubernetesSupportedVersionResponse(supportedVersionVO, true);
378385
}
379386

380387
@Override
@@ -435,7 +442,7 @@ public KubernetesSupportedVersionResponse updateKubernetesSupportedVersion(final
435442
}
436443
version = kubernetesSupportedVersionDao.findById(versionId);
437444
}
438-
return createKubernetesSupportedVersionResponse(version);
445+
return createKubernetesSupportedVersionResponse(version, true);
439446
}
440447

441448
@Override

plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesSupportedVersionResponse.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ public class KubernetesSupportedVersionResponse extends BaseResponse {
5050
@Param(description = "The name of the binaries ISO for Kubernetes supported version")
5151
private String isoName;
5252

53+
@SerializedName(ApiConstants.ISO_URL)
54+
@Param(description = "the URL of the binaries ISO for Kubernetes supported version")
55+
private String isoUrl;
56+
5357
@SerializedName(ApiConstants.ISO_STATE)
5458
@Param(description = "The state of the binaries ISO for Kubernetes supported version")
5559
private String isoState;
@@ -134,6 +138,14 @@ public void setIsoName(String isoName) {
134138
this.isoName = isoName;
135139
}
136140

141+
public String getIsoUrl() {
142+
return isoUrl;
143+
}
144+
145+
public void setIsoUrl(String isoUrl) {
146+
this.isoUrl = isoUrl;
147+
}
148+
137149
public String getIsoState() {
138150
return isoState;
139151
}

plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/version/KubernetesVersionManagerImplTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void testUpdateTemplateDetailsInKubernetesSupportedVersionResponseNullTem
4848
Mockito.when(kubernetesSupportedVersion.getIsoId()).thenReturn(1L);
4949
KubernetesSupportedVersionResponse response = new KubernetesSupportedVersionResponse();
5050
kubernetesVersionManager.updateTemplateDetailsInKubernetesSupportedVersionResponse(kubernetesSupportedVersion,
51-
response);
51+
response, true);
5252
Assert.assertNull(ReflectionTestUtils.getField(response, "isoId"));
5353
}
5454

@@ -63,13 +63,13 @@ public void testUpdateTemplateDetailsInKubernetesSupportedVersionResponseValidTe
6363
Mockito.when(templateJoinVO.getUuid()).thenReturn(uuid);
6464
Mockito.when(templateJoinDao.findById(1L)).thenReturn(templateJoinVO);
6565
kubernetesVersionManager.updateTemplateDetailsInKubernetesSupportedVersionResponse(kubernetesSupportedVersion,
66-
response);
66+
response, true);
6767
Assert.assertEquals(uuid, ReflectionTestUtils.getField(response, "isoId"));
6868
Assert.assertNull(ReflectionTestUtils.getField(response, "isoState"));
6969
ObjectInDataStoreStateMachine.State state = ObjectInDataStoreStateMachine.State.Ready;
7070
Mockito.when(templateJoinVO.getState()).thenReturn(state);
7171
kubernetesVersionManager.updateTemplateDetailsInKubernetesSupportedVersionResponse(kubernetesSupportedVersion,
72-
response);
72+
response, true);
7373
Assert.assertEquals(state.toString(), ReflectionTestUtils.getField(response, "isoState"));
7474
}
7575
}

plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/version/KubernetesVersionServiceTest.java

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717

1818
package com.cloud.kubernetes.version;
1919

20+
import static org.junit.Assert.assertNull;
21+
import static org.junit.Assert.assertNotNull;
22+
import static org.mockito.ArgumentMatchers.anyLong;
2023
import static org.mockito.Mockito.when;
2124

2225
import java.lang.reflect.Field;
@@ -25,6 +28,11 @@
2528
import java.util.UUID;
2629

2730
import com.cloud.cpu.CPU;
31+
import com.cloud.user.Account;
32+
import com.cloud.user.AccountManager;
33+
import com.cloud.user.AccountVO;
34+
import com.cloud.user.User;
35+
import com.cloud.user.UserVO;
2836
import org.apache.cloudstack.api.command.admin.kubernetes.version.AddKubernetesSupportedVersionCmd;
2937
import org.apache.cloudstack.api.command.admin.kubernetes.version.DeleteKubernetesSupportedVersionCmd;
3038
import org.apache.cloudstack.api.command.admin.kubernetes.version.UpdateKubernetesSupportedVersionCmd;
@@ -63,11 +71,6 @@
6371
import com.cloud.storage.dao.VMTemplateDao;
6472
import com.cloud.template.TemplateApiService;
6573
import com.cloud.template.VirtualMachineTemplate;
66-
import com.cloud.user.Account;
67-
import com.cloud.user.AccountManager;
68-
import com.cloud.user.AccountVO;
69-
import com.cloud.user.User;
70-
import com.cloud.user.UserVO;
7174
import com.cloud.utils.Pair;
7275
import com.cloud.utils.component.ComponentContext;
7376
import com.cloud.utils.db.Filter;
@@ -95,6 +98,8 @@ public class KubernetesVersionServiceTest {
9598
private DataCenterDao dataCenterDao;
9699
@Mock
97100
private TemplateApiService templateService;
101+
@Mock
102+
private Account accountMock;
98103

99104
AutoCloseable closeable;
100105

@@ -124,6 +129,7 @@ public void setUp() throws Exception {
124129
when(dataCenterDao.findById(Mockito.anyLong())).thenReturn(zone);
125130

126131
TemplateJoinVO templateJoinVO = Mockito.mock(TemplateJoinVO.class);
132+
when(templateJoinVO.getUrl()).thenReturn("https://download.cloudstack.com");
127133
when(templateJoinVO.getState()).thenReturn(ObjectInDataStoreStateMachine.State.Ready);
128134
when(templateJoinVO.getArch()).thenReturn(CPU.CPUArch.getDefault());
129135
when(templateJoinDao.findById(Mockito.anyLong())).thenReturn(templateJoinVO);
@@ -140,19 +146,66 @@ public void tearDown() throws Exception {
140146

141147
@Test
142148
public void listKubernetesSupportedVersionsTest() {
143-
ListKubernetesSupportedVersionsCmd cmd = Mockito.mock(ListKubernetesSupportedVersionsCmd.class);
144-
List<KubernetesSupportedVersionVO> versionVOs = new ArrayList<>();
145-
KubernetesSupportedVersionVO versionVO = Mockito.mock(KubernetesSupportedVersionVO.class);
146-
when(versionVO.getSemanticVersion()).thenReturn(KubernetesVersionService.MIN_KUBERNETES_VERSION);
147-
versionVOs.add(versionVO);
148-
when(kubernetesSupportedVersionDao.findById(Mockito.anyLong())).thenReturn(versionVO);
149-
when(kubernetesSupportedVersionDao.searchAndCount(Mockito.any(SearchCriteria.class),
150-
Mockito.any(Filter.class))).thenReturn(new Pair<>(versionVOs, versionVOs.size()));
151-
ListResponse<KubernetesSupportedVersionResponse> versionsResponse =
152-
kubernetesVersionService.listKubernetesSupportedVersions(cmd);
153-
Assert.assertEquals(versionVOs.size(), versionsResponse.getCount().intValue());
154-
Assert.assertTrue(CollectionUtils.isNotEmpty(versionsResponse.getResponses()));
155-
Assert.assertEquals(versionVOs.size(), versionsResponse.getResponses().size());
149+
CallContext callContextMock = Mockito.mock(CallContext.class);
150+
try (MockedStatic<CallContext> callContextMockedStatic = Mockito.mockStatic(CallContext.class)) {
151+
callContextMockedStatic.when(CallContext::current).thenReturn(callContextMock);
152+
final SearchCriteria<KubernetesSupportedVersionVO> versionSearchCriteria = Mockito.mock(SearchCriteria.class);
153+
when(callContextMock.getCallingAccount()).thenReturn(accountMock);
154+
ListKubernetesSupportedVersionsCmd cmd = Mockito.mock(ListKubernetesSupportedVersionsCmd.class);
155+
List<KubernetesSupportedVersionVO> versionVOs = new ArrayList<>();
156+
KubernetesSupportedVersionVO versionVO = Mockito.mock(KubernetesSupportedVersionVO.class);
157+
when(versionVO.getSemanticVersion()).thenReturn(KubernetesVersionService.MIN_KUBERNETES_VERSION);
158+
versionVOs.add(versionVO);
159+
when(kubernetesSupportedVersionDao.findById(Mockito.anyLong())).thenReturn(versionVO);
160+
when(kubernetesSupportedVersionDao.searchAndCount(Mockito.any(), Mockito.any(Filter.class)))
161+
.thenReturn(new Pair<>(versionVOs, versionVOs.size()));
162+
ListResponse<KubernetesSupportedVersionResponse> versionsResponse =
163+
kubernetesVersionService.listKubernetesSupportedVersions(cmd);
164+
Assert.assertEquals(versionVOs.size(), versionsResponse.getCount().intValue());
165+
Assert.assertTrue(CollectionUtils.isNotEmpty(versionsResponse.getResponses()));
166+
Assert.assertEquals(versionVOs.size(), versionsResponse.getResponses().size());
167+
}
168+
}
169+
170+
@Test
171+
public void listKubernetesSupportedVersionsTestWhenAdmin() {
172+
CallContext callContextMock = Mockito.mock(CallContext.class);
173+
try (MockedStatic<CallContext> callContextMockedStatic = Mockito.mockStatic(CallContext.class)) {
174+
callContextMockedStatic.when(CallContext::current).thenReturn(callContextMock);
175+
ListKubernetesSupportedVersionsCmd cmd = Mockito.mock(ListKubernetesSupportedVersionsCmd.class);
176+
List<KubernetesSupportedVersionVO> versionVOs = new ArrayList<>();
177+
KubernetesSupportedVersionVO versionVO = Mockito.mock(KubernetesSupportedVersionVO.class);
178+
when(versionVO.getSemanticVersion()).thenReturn(KubernetesVersionService.MIN_KUBERNETES_VERSION);
179+
versionVOs.add(versionVO);
180+
when(callContextMock.getCallingAccount()).thenReturn(accountMock);
181+
when(kubernetesSupportedVersionDao.findById(Mockito.anyLong())).thenReturn(versionVO);
182+
when(kubernetesSupportedVersionDao.searchAndCount(Mockito.any(), Mockito.any(Filter.class)))
183+
.thenReturn(new Pair<>(versionVOs, versionVOs.size()));
184+
when(accountManager.isRootAdmin(anyLong())).thenReturn(true);
185+
ListResponse<KubernetesSupportedVersionResponse> response = kubernetesVersionService.listKubernetesSupportedVersions(cmd);
186+
assertNotNull(response.getResponses().get(0).getIsoUrl());
187+
}
188+
}
189+
190+
@Test
191+
public void listKubernetesSupportedVersionsTestWhenOtherUser() {
192+
CallContext callContextMock = Mockito.mock(CallContext.class);
193+
try (MockedStatic<CallContext> callContextMockedStatic = Mockito.mockStatic(CallContext.class)) {
194+
callContextMockedStatic.when(CallContext::current).thenReturn(callContextMock);
195+
ListKubernetesSupportedVersionsCmd cmd = Mockito.mock(ListKubernetesSupportedVersionsCmd.class);
196+
List<KubernetesSupportedVersionVO> versionVOs = new ArrayList<>();
197+
KubernetesSupportedVersionVO versionVO = Mockito.mock(KubernetesSupportedVersionVO.class);
198+
when(versionVO.getSemanticVersion()).thenReturn(KubernetesVersionService.MIN_KUBERNETES_VERSION);
199+
versionVOs.add(versionVO);
200+
when(callContextMock.getCallingAccount()).thenReturn(accountMock);
201+
when(kubernetesSupportedVersionDao.findById(Mockito.anyLong())).thenReturn(versionVO);
202+
when(kubernetesSupportedVersionDao.searchAndCount(Mockito.any(), Mockito.any(Filter.class)))
203+
.thenReturn(new Pair<>(versionVOs, versionVOs.size()));
204+
when(accountManager.isRootAdmin(anyLong())).thenReturn(false);
205+
when(accountMock.getId()).thenReturn(2L);
206+
ListResponse<KubernetesSupportedVersionResponse> response = kubernetesVersionService.listKubernetesSupportedVersions(cmd);
207+
assertNull(response.getResponses().get(0).getIsoUrl());
208+
}
156209
}
157210

158211
@Test(expected = InvalidParameterValueException.class)
@@ -224,7 +277,6 @@ public void addKubernetesSupportedVersionIsoUrlTest() throws ResourceAllocationE
224277
mockedComponentContext.when(() -> ComponentContext.inject(Mockito.any(RegisterIsoCmd.class))).thenReturn(
225278
new RegisterIsoCmd());
226279
mockedCallContext.when(CallContext::current).thenReturn(callContext);
227-
228280
when(templateService.registerIso(Mockito.any(RegisterIsoCmd.class))).thenReturn(
229281
Mockito.mock(VirtualMachineTemplate.class));
230282
VMTemplateVO templateVO = Mockito.mock(VMTemplateVO.class);

ui/public/locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,7 @@
12541254
"label.isoname": "Attached ISO",
12551255
"label.isos": "ISOs",
12561256
"label.isostate": "ISO state",
1257+
"label.isourl": "ISO URL",
12571258
"label.ispersistent": "Persistent ",
12581259
"label.ispublic": "Public",
12591260
"label.isready": "Ready",

ui/public/locales/pt_BR.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,7 @@
874874
"label.isoname": "Imagem ISO plugada",
875875
"label.isos": "ISOs",
876876
"label.isostate": "Estado da ISO",
877+
"label.isourl": "URL da ISO",
877878
"label.ispersistent": "Persistente",
878879
"label.ispublic": "P\u00fablico",
879880
"label.isready": "Pronto",

ui/src/config/section/image.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ export default {
6060
details: () => {
6161
var fields = ['name', 'id', 'displaytext', 'checksum', 'hypervisor', 'arch', 'format', 'ostypename', 'size', 'physicalsize', 'isready', 'passwordenabled',
6262
'crossZones', 'templatetype', 'directdownload', 'deployasis', 'ispublic', 'isfeatured', 'isextractable', 'isdynamicallyscalable', 'crosszones', 'type',
63-
'account', 'domain', 'created', 'userdatadetails', 'userdatapolicy']
63+
'account', 'domain', 'created', 'userdatadetails', 'userdatapolicy', 'url']
6464
if (['Admin'].includes(store.getters.userInfo.roletype)) {
65-
fields.push('templatetag', 'templatetype', 'url')
65+
fields.push('templatetag', 'templatetype')
6666
}
6767
return fields
6868
},
@@ -372,7 +372,7 @@ export default {
372372
permission: ['listKubernetesSupportedVersions'],
373373
searchFilters: ['zoneid', 'minimumsemanticversion', 'arch'],
374374
columns: ['name', 'state', 'semanticversion', 'isostate', 'mincpunumber', 'minmemory', 'arch', 'zonename'],
375-
details: ['name', 'semanticversion', 'supportsautoscaling', 'zoneid', 'zonename', 'isoid', 'isoname', 'isostate', 'arch', 'mincpunumber', 'minmemory', 'supportsha', 'state', 'created'],
375+
details: ['name', 'semanticversion', 'supportsautoscaling', 'zoneid', 'zonename', 'isoid', 'isoname', 'isostate', 'arch', 'mincpunumber', 'minmemory', 'supportsha', 'state', 'created', 'isourl'],
376376
tabs: [
377377
{
378378
name: 'details',

0 commit comments

Comments
 (0)