Skip to content

Commit f6c1d88

Browse files
committed
feat: support custom endpoint config
Signed-off-by: njucjc <[email protected]>
1 parent 353042f commit f6c1d88

File tree

5 files changed

+181
-3
lines changed

5 files changed

+181
-3
lines changed

__tests__/login.test.js

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,4 +352,170 @@ describe('run', () => {
352352
// Act & Assert
353353
await expect(run()).rejects.toThrow(errorMessage);
354354
});
355+
356+
// Tests for endpoint handling logic
357+
test('should use custom endpoint when provided', async () => {
358+
// Arrange
359+
const mockResult = {
360+
data: {
361+
tempUserName: 'temp-user',
362+
authorizationToken: 'temp-token'
363+
}
364+
};
365+
366+
const mockROAClient = {
367+
request: jest.fn().mockResolvedValue(mockResult)
368+
};
369+
370+
ROAClient.mockImplementation(() => mockROAClient);
371+
372+
Docker.getExecOutput.mockResolvedValue({
373+
stderr: '',
374+
exitCode: 0
375+
});
376+
377+
core.getInput.mockImplementation((name) => {
378+
switch (name) {
379+
case 'access-key-id':
380+
return 'test-access-key-id';
381+
case 'access-key-secret':
382+
return 'test-access-key-secret';
383+
case 'region-id':
384+
return 'cn-hangzhou';
385+
case 'instance-id':
386+
return '';
387+
case 'endpoint':
388+
return 'https://custom.endpoint.com';
389+
case 'login-server':
390+
return '';
391+
default:
392+
return '';
393+
}
394+
});
395+
396+
// Act
397+
await run();
398+
399+
// Assert
400+
expect(ROAClient).toHaveBeenCalledWith({
401+
accessKeyId: 'test-access-key-id',
402+
accessKeySecret: 'test-access-key-secret',
403+
securityToken: '',
404+
endpoint: 'https://custom.endpoint.com', // Should use custom endpoint
405+
apiVersion: '2016-06-07'
406+
});
407+
408+
expect(mockROAClient.request).toHaveBeenCalledWith('GET', '/tokens');
409+
});
410+
411+
test('should use default endpoint when endpoint is not provided', async () => {
412+
// Arrange
413+
const mockResult = {
414+
data: {
415+
tempUserName: 'temp-user',
416+
authorizationToken: 'temp-token'
417+
}
418+
};
419+
420+
const mockROAClient = {
421+
request: jest.fn().mockResolvedValue(mockResult)
422+
};
423+
424+
ROAClient.mockImplementation(() => mockROAClient);
425+
426+
Docker.getExecOutput.mockResolvedValue({
427+
stderr: '',
428+
exitCode: 0
429+
});
430+
431+
core.getInput.mockImplementation((name) => {
432+
switch (name) {
433+
case 'access-key-id':
434+
return 'test-access-key-id';
435+
case 'access-key-secret':
436+
return 'test-access-key-secret';
437+
case 'region-id':
438+
return 'cn-hangzhou';
439+
case 'instance-id':
440+
return '';
441+
case 'endpoint':
442+
return ''; // Empty endpoint
443+
case 'login-server':
444+
return '';
445+
default:
446+
return '';
447+
}
448+
});
449+
450+
// Spy on getAPIEndpoint
451+
const { getAPIEndpoint } = require('../src/login.js');
452+
jest.spyOn({ getAPIEndpoint }, 'getAPIEndpoint');
453+
// Act
454+
await run();
455+
456+
// Assert
457+
expect(ROAClient).toHaveBeenCalledWith({
458+
accessKeyId: 'test-access-key-id',
459+
accessKeySecret: 'test-access-key-secret',
460+
securityToken: '',
461+
endpoint: 'https://cr.cn-hangzhou.aliyuncs.com', // Should use default endpoint
462+
apiVersion: '2016-06-07'
463+
});
464+
465+
expect(mockROAClient.request).toHaveBeenCalledWith('GET', '/tokens');
466+
});
467+
468+
test('should use default endpoint when endpoint is empty string', async () => {
469+
// Arrange
470+
const mockResult = {
471+
data: {
472+
tempUserName: 'temp-user',
473+
authorizationToken: 'temp-token'
474+
}
475+
};
476+
477+
const mockROAClient = {
478+
request: jest.fn().mockResolvedValue(mockResult)
479+
};
480+
481+
ROAClient.mockImplementation(() => mockROAClient);
482+
483+
Docker.getExecOutput.mockResolvedValue({
484+
stderr: '',
485+
exitCode: 0
486+
});
487+
488+
core.getInput.mockImplementation((name) => {
489+
switch (name) {
490+
case 'access-key-id':
491+
return 'test-access-key-id';
492+
case 'access-key-secret':
493+
return 'test-access-key-secret';
494+
case 'region-id':
495+
return 'cn-hangzhou';
496+
case 'instance-id':
497+
return '';
498+
case 'endpoint':
499+
return ''; // Empty string endpoint
500+
case 'login-server':
501+
return '';
502+
default:
503+
return '';
504+
}
505+
});
506+
507+
// Act
508+
await run();
509+
510+
// Assert
511+
expect(ROAClient).toHaveBeenCalledWith({
512+
accessKeyId: 'test-access-key-id',
513+
accessKeySecret: 'test-access-key-secret',
514+
securityToken: '',
515+
endpoint: 'https://cr.cn-hangzhou.aliyuncs.com', // Should use default endpoint
516+
apiVersion: '2016-06-07'
517+
});
518+
519+
expect(mockROAClient.request).toHaveBeenCalledWith('GET', '/tokens');
520+
});
355521
});

action.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ inputs:
3333
description: 'Container registry server url'
3434
required: true
3535
default: ''
36+
endpoint:
37+
description: 'Container registry endpoint for OpenAPI'
38+
required: false
39+
default: ''
3640
branding:
3741
color: 'green'
3842
icon: 'anchor'

dist/index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111759,14 +111759,18 @@ async function run() {
111759111759
let regionId = core.getInput('region-id', { required: false });
111760111760
let instanceId = core.getInput('instance-id', { required: false });
111761111761
let loginServer = core.getInput('login-server', { required: false });
111762-
let endpoint = getAPIEndpoint(regionId);
111762+
let endpoint = core.getInput("endpoint", { required: false });
111763111763

111764111764
if (accessKeyId.length > 0) {
111765111765
if (regionId.length === 0) {
111766111766
core.setFailed(`Action failed for region-id is missing`);
111767111767
return;
111768111768
}
111769111769

111770+
if (endpoint.length === 0) {
111771+
endpoint = getAPIEndpoint(regionId)
111772+
}
111773+
111770111774
if (instanceId.length === 0) {
111771111775

111772111776
if (loginServer.length === 0) {

dist/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/login.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,18 @@ async function run() {
2222
let regionId = core.getInput('region-id', { required: false });
2323
let instanceId = core.getInput('instance-id', { required: false });
2424
let loginServer = core.getInput('login-server', { required: false });
25-
let endpoint = getAPIEndpoint(regionId);
25+
let endpoint = core.getInput("endpoint", { required: false });
2626

2727
if (accessKeyId.length > 0) {
2828
if (regionId.length === 0) {
2929
core.setFailed(`Action failed for region-id is missing`);
3030
return;
3131
}
3232

33+
if (endpoint.length === 0) {
34+
endpoint = getAPIEndpoint(regionId)
35+
}
36+
3337
if (instanceId.length === 0) {
3438

3539
if (loginServer.length === 0) {

0 commit comments

Comments
 (0)