1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-12-02 05:57:29 +01:00

WIP validate for dockerhub images and 3rd party images

This commit is contained in:
Bogdan Fazakas 2021-02-25 23:03:47 +02:00
parent 9b78e46c97
commit cdd5c5cf16
3 changed files with 76 additions and 5 deletions

View File

@ -157,7 +157,11 @@ export function MetadataAlgorithmPreview({
/>
)}
{values.algorithmPrivacy && (
<MetaItem key="dockerImage" title="Private Algorithm" content="Yes" />
<MetaItem
key="algorithmPreview"
title="Private Algorithm"
content="Yes"
/>
)}
</div>
<MetaFull values={values} />

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,10 +156,14 @@ export default function PublishPage({
) => void
): Promise<void> {
const metadata = transformPublishAlgorithmFormToMetadata(values)
try {
Logger.log('Publish Algorithm with ', metadata)
const validImage = await validateDockerImage(
values.image,
values.containerTag
)
const ddo = await publish(
(metadata as unknown) as Metadata,
values.algorithmPrivacy === true ? 'compute' : 'access'

View File

@ -1,3 +1,5 @@
import axios, { CancelToken, AxiosResponse } from 'axios'
import { toast } from 'react-toastify'
import {
MetadataMarket,
MetadataPublishFormDataset,
@ -6,7 +8,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 +130,67 @@ 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)
return false
}
}
async function is3rdPartyImageValid(imageURL: string): Promise<boolean> {
try {
const response = await axios.options(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)
return false
}
}
function isUrl(image: string): boolean {
const pattern = new RegExp(
'^(https?:\\/\\/)?' +
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' +
'((\\d{1,3}\\.){3}\\d{1,3}))' +
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' +
'(\\?[;&a-z\\d%_.~+=-]*)?' +
'(\\#[-a-z\\d_]*)?$',
'i'
)
return !!pattern.test(image)
}
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,