diff --git a/backend/src/connectors/audit/Base.ts b/backend/src/connectors/audit/Base.ts index 21e46dc03..a920f65e4 100644 --- a/backend/src/connectors/audit/Base.ts +++ b/backend/src/connectors/audit/Base.ts @@ -181,7 +181,13 @@ export abstract class BaseAuditConnector { ) abstract onCreateS3Export(req: Request, modelId: string, semvers?: string[]) - abstract onCreateImport(req: Request, mirroredModelId: string, sourceModelId: string, modelCardVersions: number[]) + abstract onCreateImport( + req: Request, + mirroredModelId: string, + sourceModelId: string, + modelCardVersions: number[], + exporter: string, + ) abstract onError(req: Request, error: BailoError) diff --git a/backend/src/connectors/audit/silly.ts b/backend/src/connectors/audit/silly.ts index 1bcbd704a..0302b5945 100644 --- a/backend/src/connectors/audit/silly.ts +++ b/backend/src/connectors/audit/silly.ts @@ -57,7 +57,13 @@ export class SillyAuditConnector extends BaseAuditConnector { onUpdateInference(_req: Request, _inferences: InferenceDoc) {} onCreateInference(_req: Request, _inferences: InferenceDoc) {} onCreateS3Export(_req: Request, _modelId: string, _semvers?: string[]) {} - onCreateImport(_req: Request, _mirroredModelId: string, _sourceModelId: string, _modelCardVersions: number[]) {} + onCreateImport( + _req: Request, + _mirroredModelId: string, + _sourceModelId: string, + _modelCardVersions: number[], + _exporter: string, + ) {} onError(_req: Request, _error: BailoError) {} onCreateCommentResponse(_req: Request, _responseInterface: ResponseInterface) {} onViewResponses(_req: Request, _responseInters: ResponseInterface[]) {} diff --git a/backend/src/connectors/audit/stdout.ts b/backend/src/connectors/audit/stdout.ts index 29095374f..65464eefc 100644 --- a/backend/src/connectors/audit/stdout.ts +++ b/backend/src/connectors/audit/stdout.ts @@ -340,9 +340,15 @@ export class StdoutAuditConnector extends BaseAuditConnector { req.log.info(event, req.audit.description) } - onCreateImport(req: Request, mirroredModelId: string, sourceModelId: string, modelCardVersions: number[]) { + onCreateImport( + req: Request, + mirroredModelId: string, + sourceModelId: string, + modelCardVersions: number[], + exporter: string, + ) { this.checkEventType(AuditInfo.CreateImport, req) - const event = this.generateEvent(req, { mirroredModelId, sourceModelId, modelCardVersions }) + const event = this.generateEvent(req, { mirroredModelId, sourceModelId, modelCardVersions, exporter }) req.log.info(event, req.audit.description) } } diff --git a/backend/src/routes/v2/model/postRequestImport.ts b/backend/src/routes/v2/model/postRequestImport.ts index eb688578e..b0f78edd2 100644 --- a/backend/src/routes/v2/model/postRequestImport.ts +++ b/backend/src/routes/v2/model/postRequestImport.ts @@ -12,6 +12,7 @@ export const postRequestImportFromS3Schema = z.object({ body: z.object({ payloadUrl: z.string(), mirroredModelId: z.string(), + exporter: z.string(), }), }) @@ -48,11 +49,17 @@ export const postRequestImportFromS3 = [ async (req: Request, res: Response) => { req.audit = AuditInfo.CreateImport const { - body: { payloadUrl, mirroredModelId }, + body: { payloadUrl, mirroredModelId, exporter }, } = parse(req, postRequestImportFromS3Schema) const importInfo = await importModel(req.user, mirroredModelId, payloadUrl) - await audit.onCreateImport(req, importInfo.mirroredModelId, importInfo.sourceModelId, importInfo.modelCardVersions) + await audit.onCreateImport( + req, + importInfo.mirroredModelId, + importInfo.sourceModelId, + importInfo.modelCardVersions, + exporter, + ) return res.json(importInfo) }, diff --git a/backend/src/services/mirroredModel.ts b/backend/src/services/mirroredModel.ts index 7e703edec..613526ab3 100644 --- a/backend/src/services/mirroredModel.ts +++ b/backend/src/services/mirroredModel.ts @@ -61,7 +61,7 @@ export async function exportModel( if (config.modelMirror.export.kmsSignature.enabled) { log.debug({ modelId, semvers }, 'Using signatures. Uploading to temporary S3 location first.') uploadToTemporaryS3Location(modelId, semvers, s3Stream).then(() => - copyToExportBucketWithSignatures(modelId, semvers, mirroredModelId).catch((error) => + copyToExportBucketWithSignatures(modelId, semvers, mirroredModelId, user.dn).catch((error) => log.error({ modelId, semvers, error }, 'Failed to upload export to export location with signatures'), ), ) @@ -92,6 +92,8 @@ export async function importModel(_user: UserInterface, mirroredModelId: string, } let sourceModelId + log.info({ mirroredModelId, payloadUrl }, 'Received a request to import a model.') + let res: Response try { res = await fetch(payloadUrl) @@ -109,6 +111,8 @@ export async function importModel(_user: UserInterface, mirroredModelId: string, throw InternalError('Unable to get the file.', { payloadUrl }) } + log.info({ mirroredModelId, payloadUrl }, 'Obtained the file from the payload URL.') + const modelCards: ModelCardRevisionInterface[] = [] const zipData = new Uint8Array(await res.arrayBuffer()) let zipContent @@ -134,8 +138,15 @@ export async function importModel(_user: UserInterface, mirroredModelId: string, modelCards.push(modelCard) }) + log.info({ mirroredModelId, payloadUrl, sourceModelId }, 'Finished parsing the collection of model cards.') + await Promise.all(modelCards.map((card) => saveImportedModelCard(card, sourceModelId))) await setLatestImportedModelCard(mirroredModelId) + log.info( + { mirroredModelId, payloadUrl, sourceModelId, modelCardVersions: modelCards.map((modelCard) => modelCard.version) }, + 'Finished importing the collection of model cards.', + ) + return { mirroredModelId, sourceModelId, modelCardVersions: modelCards.map((modelCard) => modelCard.version) } } @@ -160,6 +171,7 @@ async function copyToExportBucketWithSignatures( modelId: string, semvers: string[] | undefined, mirroredModelId: string, + exporter: string, ) { let signatures = {} log.debug({ modelId, semvers }, 'Getting stream from S3 to generate signatures.') @@ -178,6 +190,7 @@ async function copyToExportBucketWithSignatures( await uploadToExportS3Location(modelId, semvers, streamToCopy, { modelId, mirroredModelId, + exporter, ...signatures, }) } diff --git a/backend/src/services/smtp/smtp.ts b/backend/src/services/smtp/smtp.ts index 1e72cfc11..270e1b9c3 100644 --- a/backend/src/services/smtp/smtp.ts +++ b/backend/src/services/smtp/smtp.ts @@ -191,9 +191,9 @@ async function sendEmail(email: Mail.Options) { ...email, }) log.info({ messageId: info.messageId }, 'Email sent') - } catch (err) { + } catch (error) { const content = { to: email.to, subject: email.subject, text: email.text } - log.warn(content, `Unable to send email`) + log.warn({ content, error }, `Unable to send email`) return Promise.reject(`Unable to send email: ${JSON.stringify(content)}`) } }