1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-07-01 06:11:43 +02:00

Merge pull request #405 from oceanprotocol/issue398-validate-dockerImages

Validate custom Docker images
This commit is contained in:
Bogdan Fazakas 2021-03-03 15:22:39 +02:00 committed by GitHub
commit 82b291de03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 86 additions and 25 deletions

View File

@ -134,7 +134,6 @@ export default function FormPublish(): ReactElement {
<Field
key={field.name}
{...field}
disabled={field.disabled}
component={Input}
onChange={(e: ChangeEvent<HTMLInputElement>) =>
handleFieldChange(e, field)

View File

@ -11,11 +11,11 @@ import {
initialValues as initialValuesAlgorithm,
validationSchema as validationSchemaAlgorithm
} from '../../../models/FormAlgoPublish'
import {
transformPublishFormToMetadata,
transformPublishAlgorithmFormToMetadata,
mapTimeoutStringToSeconds
mapTimeoutStringToSeconds,
validateDockerImage
} from '../../../utils/metadata'
import {
MetadataPreview,
@ -156,31 +156,36 @@ export default function PublishPage({
) => void
): Promise<void> {
const metadata = transformPublishAlgorithmFormToMetadata(values)
const validDockerImage =
values.dockerImage === 'custom image'
? await validateDockerImage(values.image, values.containerTag)
: true
try {
Logger.log('Publish Algorithm with ', metadata)
if (validDockerImage) {
Logger.log('Publish Algorithm with ', metadata)
const ddo = await publish(
(metadata as unknown) as Metadata,
values.algorithmPrivacy === true ? 'compute' : 'access'
)
const ddo = await publish(
(metadata as unknown) as Metadata,
values.algorithmPrivacy === true ? 'compute' : 'access'
)
// Publish failed
if (!ddo || publishError) {
setError(publishError || 'Publishing DDO failed.')
Logger.error(publishError || 'Publishing DDO failed.')
return
// Publish failed
if (!ddo || publishError) {
setError(publishError || 'Publishing DDO failed.')
Logger.error(publishError || 'Publishing DDO failed.')
return
}
// Publish succeeded
setDid(ddo.id)
setSuccess(
'🎉 Successfully published. 🎉 Now create a price for your algorithm.'
)
resetForm({
values: initialValuesAlgorithm as MetadataPublishFormAlgorithm,
status: 'empty'
})
}
// Publish succeeded
setDid(ddo.id)
setSuccess(
'🎉 Successfully published. 🎉 Now create a price for your algorithm.'
)
resetForm({
values: initialValuesAlgorithm as MetadataPublishFormAlgorithm,
status: 'empty'
})
} catch (error) {
setError(error.message)
Logger.error(error.message)

View File

@ -1,3 +1,6 @@
import axios, { CancelToken, AxiosResponse } from 'axios'
import { toast } from 'react-toastify'
import isUrl from 'is-url-superb'
import {
MetadataMarket,
MetadataPublishFormDataset,
@ -6,7 +9,7 @@ import {
import { toStringNoMS } from '.'
import AssetModel from '../models/Asset'
import slugify from '@sindresorhus/slugify'
import { DDO, MetadataAlgorithm } from '@oceanprotocol/lib'
import { DDO, MetadataAlgorithm, Logger } from '@oceanprotocol/lib'
export function transformTags(value: string): string[] {
const originalTags = value?.split(',')
@ -128,6 +131,60 @@ export function transformPublishFormToMetadata(
return metadata
}
async function isDockerHubImageValid(
image: string,
tag: string
): Promise<boolean> {
try {
const response = await axios.get(
`https://hub.docker.com/v2/repositories/${image}/tags/${tag}`
)
if (!response || response.status !== 200 || !response.data) {
toast.error(
'Could not fetch docker hub image info. Please check image name and tag and try again'
)
return false
}
return true
} catch (error) {
Logger.error(error.message)
toast.error(
'Could not fetch docker hub image info. Please check image name and tag and try again'
)
return false
}
}
async function is3rdPartyImageValid(imageURL: string): Promise<boolean> {
try {
const response = await axios.head(imageURL)
if (!response || response.status !== 200) {
toast.error(
'Could not fetch docker image info. Please check URL and try again'
)
return false
}
return true
} catch (error) {
Logger.error(error.message)
toast.error(
'Could not fetch docker image info. Please check URL and try again'
)
return false
}
}
export async function validateDockerImage(
dockerImage: string,
tag: string
): Promise<boolean> {
const isValid = isUrl(dockerImage)
? await is3rdPartyImageValid(dockerImage)
: await isDockerHubImageValid(dockerImage, tag)
return isValid
}
export function transformPublishAlgorithmFormToMetadata(
{
name,