Skip to content

Commit d714d66

Browse files
authored
Merge pull request #35 from InfuseAI/bug/sc-23487/bug-crane-will-encounter-backend-crash-issue
Bug/sc 23487/bug crane will encounter backend crash issue
2 parents a0a1ba9 + 06c573b commit d714d66

File tree

5 files changed

+157
-62
lines changed

5 files changed

+157
-62
lines changed

src/ListImage.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ export default function ListImage() {
141141
setLogDrawerVisible(true);
142142
setLogText(`Start receive push log stream: ${image_name}`);
143143
pushLogReceiver(ipc_name);
144+
} else {
145+
notification.error({
146+
message: 'Push Failed',
147+
description: `[DockerHub] No credentials have been configured`,
148+
});
144149
}
145150
};
146151

src/ListRemoteImage.tsx

+11-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,15 @@ export default function ListRemoteImages() {
6060
const fetchCredential = async () => {
6161
// @ts-ignore
6262
const credential: any = await send('get-dockerhub-credential');
63-
setDockerhub(credential);
63+
if (credential.account && credential.password) {
64+
setDockerhub(credential);
65+
} else {
66+
notification.error({
67+
message: 'Missing DockerHub Credential',
68+
description: 'Please add your DockerHub credential',
69+
});
70+
setLoading(false);
71+
}
6472
};
6573

6674
const genClient = async (username, password) => {
@@ -214,6 +222,8 @@ export default function ListRemoteImages() {
214222
});
215223
console.log(error);
216224
}
225+
} else {
226+
console.log('No DockerHub Credential');
217227
}
218228
};
219229
};

src/Settings.tsx

+43-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { Select } from 'antd';
2424
const { Option } = Select;
2525
const { Content } = Layout;
2626
const { TabPane } = Tabs;
27+
const defaultAwsRegion = 'us-east-1';
2728

2829
export default function Settings() {
2930
const { tabName } = useParams<{ tabName: string }>();
@@ -99,6 +100,37 @@ export default function Settings() {
99100
});
100101
}
101102
};
103+
const onDockerHubReset = async () => {
104+
await send('delete-dockerhub-credential');
105+
notification.info({
106+
message: 'DockerHub setup reset.',
107+
});
108+
dockerHubForm.setFieldsValue({
109+
'docker-account': '',
110+
'docker-password': '',
111+
});
112+
};
113+
const onAwsReset = async () => {
114+
await send('delete-aws-credential');
115+
notification.info({
116+
message: 'AWS setup reset.',
117+
});
118+
awsForm.setFieldsValue({
119+
'aws-id': '',
120+
'aws-key': '',
121+
'aws-region': defaultAwsRegion,
122+
});
123+
};
124+
const onPrimeHubReset = async () => {
125+
await send('delete-primehub-credential');
126+
notification.info({
127+
message: 'PrimeHub setup reset.',
128+
});
129+
primeHubForm.setFieldsValue({
130+
'primehub-api-endpoint': '',
131+
'primehub-api-token': '',
132+
});
133+
};
102134
useEffect(() => {
103135
async function fetchCredential() {
104136
const credential: any = await send('get-dockerhub-credential');
@@ -132,7 +164,7 @@ export default function Settings() {
132164
useEffect(() => {
133165
async function fetchCredential() {
134166
const credential: any = await send('get-aws-credential');
135-
if (credential) {
167+
if (credential.accessKey && credential.secretKey && credential.region) {
136168
awsForm.setFieldsValue({
137169
'aws-id': credential.accessKey,
138170
});
@@ -181,7 +213,9 @@ export default function Settings() {
181213
<Button type='primary' htmlType='submit'>
182214
Save
183215
</Button>
184-
<Button style={{ margin: '0 8px' }}>Reset</Button>
216+
<Button style={{ margin: '0 8px' }} onClick={onDockerHubReset}>
217+
Reset
218+
</Button>
185219
</Form.Item>
186220
</Form>
187221
</TabPane>
@@ -190,7 +224,7 @@ export default function Settings() {
190224
layout='vertical'
191225
form={awsForm}
192226
name='settings'
193-
initialValues={{ 'aws-region': 'us-east-1' }}
227+
initialValues={{ 'aws-region': defaultAwsRegion }}
194228
onFinish={onAwsFinish}
195229
>
196230
<Form.Item label='Region' name='aws-region'>
@@ -243,7 +277,9 @@ export default function Settings() {
243277
<Button type='primary' htmlType='submit'>
244278
Save
245279
</Button>
246-
{/* <Button style={{ margin: '0 8px' }}>Reset</Button> */}
280+
<Button style={{ margin: '0 8px' }} onClick={onAwsReset}>
281+
Reset
282+
</Button>
247283
</Form.Item>
248284
</Form>
249285
</TabPane>
@@ -300,7 +336,9 @@ export default function Settings() {
300336
<Button type='primary' htmlType='submit'>
301337
Save
302338
</Button>
303-
<Button style={{ margin: '0 8px' }}>Reset</Button>
339+
<Button style={{ margin: '0 8px' }} onClick={onPrimeHubReset}>
340+
Reset
341+
</Button>
304342
</Form.Item>
305343
</Form>
306344
</TabPane>

src/electron/ServerHandlers.ts

+97-55
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ getAwsCredential()
2121
const aws = AwsAdapter.getInstance();
2222
return aws.verifyAccessPermission();
2323
})
24-
.then(data => console.log(data))
25-
.catch(err => console.log(err));
24+
.then((data) => console.log(data))
25+
.catch((err) => console.log(err));
2626

2727
export function generateDockerfile(options) {
2828
let base_image_url = options['base_image_url'];
@@ -72,25 +72,39 @@ ${pip}`;
7272
return dockerfileContent;
7373
}
7474

75-
export async function getCredential(keyname) {
76-
const credentials = await keytar.findCredentials(keyname);
75+
export async function getCredential(
76+
keyName: string
77+
): Promise<{ account: string; password: string }> {
78+
const credentials = await keytar.findCredentials(keyName);
7779
if (!credentials || credentials.length === 0) {
78-
return null;
80+
return { account: '', password: '' };
7981
}
80-
console.log('[Get ' + keyname + ' Credential]', credentials[0]);
82+
console.log('[Get ' + keyName + ' Credential]', credentials[0]);
8183
return credentials[0];
8284
}
8385

84-
export async function saveCredential(keyname, account, password) {
85-
const existCredential = await getCredential(keyname);
86-
if (existCredential) {
87-
await keytar.deletePassword(keyname, existCredential.account);
86+
export async function saveCredential(
87+
keyName: string,
88+
account: string,
89+
password: string
90+
): Promise<{ account: string; password: string }> {
91+
const existCredential = await getCredential(keyName);
92+
if (existCredential.account) {
93+
await keytar.deletePassword(keyName, existCredential.account);
8894
}
89-
await keytar.setPassword(keyname, account, password);
90-
console.log('[' + keyname + ' Credential Saved]');
95+
await keytar.setPassword(keyName, account, password);
96+
console.log('[' + keyName + ' Credential Saved]');
9197
return { account, password };
9298
}
9399

100+
export async function deleteCredential(keyName: string) {
101+
const existCredential = await getCredential(keyName);
102+
if (existCredential.account) {
103+
await keytar.deletePassword(keyName, existCredential.account);
104+
}
105+
console.log('[' + keyName + ' Credential Deleted]');
106+
}
107+
94108
export function writeDockerfile(dockerfileContent) {
95109
fs.writeFileSync(
96110
path.join(config.workingDir, 'Dockerfile'),
@@ -149,6 +163,14 @@ const handlers = {
149163
}
150164
await saveCredential(awsRegionKeyName, 'region', region);
151165
},
166+
'delete-dockerhub-credential': async () =>
167+
await deleteCredential(dockerHubCredentialKeyName),
168+
'delete-primehub-credential': async () =>
169+
await deleteCredential(primeHubCredentialKeyName),
170+
'delete-aws-credential': async () => {
171+
await deleteCredential(awsCredentialKeyName);
172+
await deleteCredential(awsRegionKeyName);
173+
},
152174
'build-status': async () => {
153175
return handlers.build_status;
154176
},
@@ -234,54 +256,74 @@ const handlers = {
234256
const [username, password] = plaintext.split(':');
235257
return { username, password };
236258
}
237-
const { repoName, tag } = extractTrueName(image_name);
238-
const ecrRegistry = await AwsAdapter.getInstance().createEcrRepository(
239-
repoName
240-
);
241-
const ecrToken = await AwsAdapter.getInstance().getAuthorizationToken();
242-
const authToken = ecrToken.authorizationData[0].authorizationToken;
243-
const endpoint = ecrToken.authorizationData[0].proxyEndpoint;
244-
const { username, password } = extractAuthPassword(authToken);
245-
const auth = {
246-
username: username,
247-
password: password,
248-
serveraddress: endpoint,
249-
};
250259

251-
// Generate Image Tag for ECR
252-
const ecrImageName = `${ecrRegistry.repositoryUri}:${tag}`;
253-
await docker
254-
.getImage(image_name)
255-
.tag({ repo: ecrRegistry.repositoryUri, tag: tag });
260+
try {
261+
const { repoName, tag } = extractTrueName(image_name);
262+
const ecrRegistry = await AwsAdapter.getInstance().createEcrRepository(
263+
repoName
264+
);
265+
const ecrToken = await AwsAdapter.getInstance().getAuthorizationToken();
266+
const authToken = ecrToken.authorizationData[0].authorizationToken;
267+
const endpoint = ecrToken.authorizationData[0].proxyEndpoint;
268+
const { username, password } = extractAuthPassword(authToken);
269+
const auth = {
270+
username: username,
271+
password: password,
272+
serveraddress: endpoint,
273+
};
256274

257-
console.log(`[Push Image] ${ecrImageName}`, ecrRegistry);
258-
const push_stream = await docker.getImage(ecrImageName).push({
259-
authconfig: auth,
260-
});
275+
// Generate Image Tag for ECR
276+
const ecrImageName = `${ecrRegistry.repositoryUri}:${tag}`;
277+
await docker
278+
.getImage(image_name)
279+
.tag({ repo: ecrRegistry.repositoryUri, tag: tag });
261280

262-
const log_ipc_name = `push-log-${ecrImageName}`;
263-
docker.modem.followProgress(
264-
push_stream,
265-
(err, output) => {
266-
handlers.build_status = 'finished';
267-
console.log('push finished', err, output);
268-
send(log_ipc_name, {
269-
stage: 'finished',
270-
error: err,
271-
output: output,
281+
console.log(`[Push Image] ${ecrImageName}`, ecrRegistry);
282+
const push_stream = await docker.getImage(ecrImageName).push({
283+
authconfig: auth,
284+
});
285+
286+
const log_ipc_name = `push-log-${ecrImageName}`;
287+
docker.modem.followProgress(
288+
push_stream,
289+
(err, output) => {
290+
handlers.build_status = 'finished';
291+
console.log('push finished', err, output);
292+
send(log_ipc_name, {
293+
stage: 'finished',
294+
error: err,
295+
output: output,
296+
});
297+
},
298+
(event) => {
299+
console.log(event);
300+
send(log_ipc_name, {
301+
stage: 'progressing',
302+
output: event,
303+
});
304+
handlers.build_events.push(event);
305+
}
306+
);
307+
return log_ipc_name;
308+
} catch (error) {
309+
async function sleep(time: number): Promise<void> {
310+
return new Promise<void>((res, rej) => {
311+
setTimeout(res, time);
272312
});
273-
},
274-
(event) => {
275-
console.log(event);
276-
send(log_ipc_name, {
277-
stage: 'progressing',
278-
output: event,
313+
}
314+
async function throwErrorByIpc(ipc_name: string, error) {
315+
await sleep(1000);
316+
send(ipc_name, {
317+
stage: 'finished',
318+
error: error,
319+
output: [{ error: `[AWS] ${error.message}` }],
279320
});
280-
handlers.build_events.push(event);
281321
}
282-
);
283-
284-
return log_ipc_name;
322+
const error_ipc_name = `push-log-${image_name}`;
323+
console.log('push error', error.message);
324+
throwErrorByIpc(error_ipc_name, error);
325+
return error_ipc_name;
326+
}
285327
},
286328
'get-image-detail': async ({ image_name }) => {
287329
const image = await docker.getImage(image_name);
@@ -302,7 +344,7 @@ const handlers = {
302344
return { repoName, tag: tag || 'latest' };
303345
}
304346
const credential = await getCredential(dockerHubCredentialKeyName);
305-
if (!credential) {
347+
if (!credential.account || !credential.password) {
306348
return null;
307349
}
308350
const auth = {

src/utils/ipcClient.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export function init() {
5757
});
5858
}
5959

60-
export function send(name, args?) {
60+
export function send(name, args?): Promise<any> {
6161
return new Promise((resolve, reject) => {
6262
let id = window.myapp.uuid.v4();
6363
replyHandlers.set(id, { resolve, reject });

0 commit comments

Comments
 (0)