Skip to content

Commit aef872a

Browse files
Fix the kubeconfig download content (#67)
* Fix the kubeconfig download content * fix tests --------- Co-authored-by: Grzegorz Krajniak <[email protected]>
1 parent 588bd53 commit aef872a

File tree

8 files changed

+174
-67
lines changed

8 files changed

+174
-67
lines changed

package-lock.json

Lines changed: 144 additions & 56 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"@angular/compiler-cli": "^20.2.1",
3030
"@angular/localize": "^20.2.1",
3131
"@briebug/jest-schematic": "^6.0.0",
32-
"@openmfp/portal-ui-lib": "^0.180.0",
32+
"@openmfp/portal-ui-lib": ">=0.180.0",
3333
"@openmfp/config-prettier": "^0.8.1",
3434
"@types/jest": "^30.0.0",
3535
"@types/jmespath": "0.15.2",

projects/lib/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"prettier": "@openmfp/config-prettier",
88
"peerDependencies": {
9-
"@openmfp/portal-ui-lib": ">=0.179.9",
9+
"@openmfp/portal-ui-lib": ">=0.180.0",
1010
"@angular/common": "^19.0.0 || ^20.0.0",
1111
"@angular/compiler": "^19.0.0 || ^20.0.0",
1212
"@angular/core": "^19.0.0 || ^20.0.0",

projects/lib/services/resource/resource-node-context.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ export interface ResourceNodeContext extends Partial<NodeContext> {
1313
namespaceId?: string;
1414
portalContext: {
1515
crdGatewayApiUrl: string;
16+
kcpWorkspaceUrl?: string;
1617
};
1718
}

projects/wc/src/app/components/generic-ui/detail-view/detail-view.component.spec.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
import { DetailViewComponent } from './detail-view.component';
22
import { ComponentFixture, TestBed } from '@angular/core/testing';
3+
import { EnvConfigService } from '@openmfp/portal-ui-lib';
34
import {
45
GatewayService,
56
ResourceService,
67
} from '@platform-mesh/portal-ui-lib/services';
8+
import { mock } from 'jest-mock-extended';
79
import { of, throwError } from 'rxjs';
810

911
describe('DetailViewComponent', () => {
1012
let component: DetailViewComponent;
1113
let fixture: ComponentFixture<DetailViewComponent>;
1214
let mockResourceService: any;
1315
let mockGatewayService: any;
16+
let envConfigServiceMock: jest.Mocked<EnvConfigService>;
1417
let luigiClientLinkManagerNavigate = jest.fn();
1518

1619
beforeEach(() => {
20+
envConfigServiceMock = mock();
1721
mockResourceService = {
1822
read: jest.fn().mockReturnValue(of({ name: 'test-resource' })),
1923
readAccountInfo: jest.fn().mockReturnValue(of('mock-ca-data')),
@@ -27,6 +31,7 @@ describe('DetailViewComponent', () => {
2731
providers: [
2832
{ provide: ResourceService, useValue: mockResourceService },
2933
{ provide: GatewayService, useValue: mockGatewayService },
34+
{ provide: EnvConfigService, useValue: envConfigServiceMock },
3035
],
3136
}).overrideComponent(DetailViewComponent, {
3237
set: { template: '<div></div>' },
@@ -47,6 +52,7 @@ describe('DetailViewComponent', () => {
4752
},
4853
},
4954
},
55+
portalContext: { kcpWorkspaceUrl: 'https://example.com' },
5056
entity: {
5157
metadata: { name: 'test-resource' },
5258
},
@@ -66,9 +72,7 @@ describe('DetailViewComponent', () => {
6672
});
6773

6874
afterEach(() => {
69-
// Очищаем все моки после каждого теста
7075
jest.restoreAllMocks();
71-
// Удаляем глобальные моки
7276
delete global.URL.createObjectURL;
7377
});
7478

@@ -115,9 +119,11 @@ describe('DetailViewComponent', () => {
115119
const createElementSpy = jest
116120
.spyOn(document, 'createElement')
117121
.mockReturnValue(mockAnchorElement);
118-
const createObjectURLSpy = jest.fn().mockReturnValue('blob-url');
119-
global.URL.createObjectURL = createObjectURLSpy;
122+
global.URL.createObjectURL = jest.fn().mockReturnValue('blob-url');
120123

124+
envConfigServiceMock.getEnvConfig.mockResolvedValue({
125+
oidcIssuerUrl: 'oidcIssuerUrl',
126+
} as any);
121127
await component.downloadKubeConfig();
122128

123129
expect(createElementSpy).toHaveBeenCalledWith('a');

projects/wc/src/app/components/generic-ui/detail-view/detail-view.component.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
signal,
1313
} from '@angular/core';
1414
import { LuigiClient } from '@luigi-project/client/luigi-element';
15+
import { EnvConfigService } from '@openmfp/portal-ui-lib';
1516
import { FieldDefinition, Resource } from '@platform-mesh/portal-ui-lib/models';
1617
import {
1718
GatewayService,
@@ -44,7 +45,6 @@ const defaultFields: FieldDefinition[] = [
4445

4546
@Component({
4647
selector: 'detail-view',
47-
encapsulation: ViewEncapsulation.ShadowDom,
4848
standalone: true,
4949
imports: [
5050
DynamicPageComponent,
@@ -59,11 +59,13 @@ const defaultFields: FieldDefinition[] = [
5959
],
6060
templateUrl: './detail-view.component.html',
6161
styleUrl: './detail-view.component.scss',
62+
encapsulation: ViewEncapsulation.ShadowDom,
6263
changeDetection: ChangeDetectionStrategy.OnPush,
6364
})
6465
export class DetailViewComponent {
6566
private resourceService = inject(ResourceService);
6667
private gatewayService = inject(GatewayService);
68+
private envConfigService = inject(EnvConfigService);
6769
protected readonly getResourceValueByJsonPath = getResourceValueByJsonPath;
6870

6971
LuigiClient = input<LuigiClient>();
@@ -115,9 +117,16 @@ export class DetailViewComponent {
115117
}
116118

117119
async downloadKubeConfig() {
120+
const { oidcIssuerUrl } = await this.envConfigService.getEnvConfig();
121+
118122
const kubeConfig = kubeConfigTemplate
119123
.replaceAll('<cluster-name>', this.context().accountId)
120-
.replaceAll('<server-url>', this.workspacePath)
124+
.replaceAll('<org-name>', this.context().organization)
125+
.replaceAll(
126+
'<server-url>',
127+
`${this.context().portalContext.kcpWorkspaceUrl}:${this.context().accountId}`,
128+
)
129+
.replaceAll('<oidc-issuer-url>', oidcIssuerUrl)
121130
.replaceAll('<ca-data>', this.context().kcpCA)
122131
.replaceAll('<token>', this.context().token);
123132

projects/wc/src/app/components/generic-ui/detail-view/kubeconfig-template.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const kubeConfigTemplate = `
55
- name: <cluster-name>
66
cluster:
77
certificate-authority-data: <ca-data>
8-
server: "https://kcp.api.portal.cc-one.showroom.apeirora.eu/clusters/<server-url>"
8+
server: <server-url>
99
contexts:
1010
- name: <cluster-name>
1111
context:
@@ -20,8 +20,8 @@ export const kubeConfigTemplate = `
2020
args:
2121
- oidc-login
2222
- get-token
23-
- --oidc-issuer-url=https://portal.cc-one.showroom.apeirora.eu/keycloak/realms/openmfp
24-
- --oidc-client-id=openmfp-public
23+
- --oidc-issuer-url=<oidc-issuer-url>
24+
- --oidc-client-id=<org-name>
2525
- --oidc-extra-scope=email
2626
- --oidc-extra-scope=groups
2727
command: kubectl

projects/wc/src/app/components/organization-management/organization-management.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ describe('OrganizationManagementComponent', () => {
174174
access_token: 'test-access-token',
175175
id_token: 'test-id-token',
176176
},
177+
uiOptions: [],
177178
};
178179
envConfigServiceMock.getEnvConfig.mockResolvedValue(mockEnvConfig);
179180
component.organizationToSwitch.set('newOrg');
@@ -201,6 +202,7 @@ describe('OrganizationManagementComponent', () => {
201202
access_token: 'test-access-token',
202203
id_token: 'test-id-token',
203204
},
205+
uiOptions: [],
204206
};
205207
envConfigServiceMock.getEnvConfig.mockResolvedValue(mockEnvConfig);
206208
component.organizationToSwitch.set('invalid-org-name-'); // Invalid: ends with hyphen
@@ -227,6 +229,7 @@ describe('OrganizationManagementComponent', () => {
227229
access_token: 'test-access-token',
228230
id_token: 'test-id-token',
229231
},
232+
uiOptions: [],
230233
};
231234
envConfigServiceMock.getEnvConfig.mockResolvedValue(mockEnvConfig);
232235
component.organizationToSwitch.set('validorg');

0 commit comments

Comments
 (0)