mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
Merge pull request #405 from oceanprotocol/issue398-validate-dockerImages
Validate custom Docker images
This commit is contained in:
commit
82b291de03
@ -134,7 +134,6 @@ export default function FormPublish(): ReactElement {
|
|||||||
<Field
|
<Field
|
||||||
key={field.name}
|
key={field.name}
|
||||||
{...field}
|
{...field}
|
||||||
disabled={field.disabled}
|
|
||||||
component={Input}
|
component={Input}
|
||||||
onChange={(e: ChangeEvent<HTMLInputElement>) =>
|
onChange={(e: ChangeEvent<HTMLInputElement>) =>
|
||||||
handleFieldChange(e, field)
|
handleFieldChange(e, field)
|
||||||
|
@ -11,11 +11,11 @@ import {
|
|||||||
initialValues as initialValuesAlgorithm,
|
initialValues as initialValuesAlgorithm,
|
||||||
validationSchema as validationSchemaAlgorithm
|
validationSchema as validationSchemaAlgorithm
|
||||||
} from '../../../models/FormAlgoPublish'
|
} from '../../../models/FormAlgoPublish'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
transformPublishFormToMetadata,
|
transformPublishFormToMetadata,
|
||||||
transformPublishAlgorithmFormToMetadata,
|
transformPublishAlgorithmFormToMetadata,
|
||||||
mapTimeoutStringToSeconds
|
mapTimeoutStringToSeconds,
|
||||||
|
validateDockerImage
|
||||||
} from '../../../utils/metadata'
|
} from '../../../utils/metadata'
|
||||||
import {
|
import {
|
||||||
MetadataPreview,
|
MetadataPreview,
|
||||||
@ -156,31 +156,36 @@ export default function PublishPage({
|
|||||||
) => void
|
) => void
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const metadata = transformPublishAlgorithmFormToMetadata(values)
|
const metadata = transformPublishAlgorithmFormToMetadata(values)
|
||||||
|
const validDockerImage =
|
||||||
|
values.dockerImage === 'custom image'
|
||||||
|
? await validateDockerImage(values.image, values.containerTag)
|
||||||
|
: true
|
||||||
try {
|
try {
|
||||||
Logger.log('Publish Algorithm with ', metadata)
|
if (validDockerImage) {
|
||||||
|
Logger.log('Publish Algorithm with ', metadata)
|
||||||
|
|
||||||
const ddo = await publish(
|
const ddo = await publish(
|
||||||
(metadata as unknown) as Metadata,
|
(metadata as unknown) as Metadata,
|
||||||
values.algorithmPrivacy === true ? 'compute' : 'access'
|
values.algorithmPrivacy === true ? 'compute' : 'access'
|
||||||
)
|
)
|
||||||
|
|
||||||
// Publish failed
|
// Publish failed
|
||||||
if (!ddo || publishError) {
|
if (!ddo || publishError) {
|
||||||
setError(publishError || 'Publishing DDO failed.')
|
setError(publishError || 'Publishing DDO failed.')
|
||||||
Logger.error(publishError || 'Publishing DDO failed.')
|
Logger.error(publishError || 'Publishing DDO failed.')
|
||||||
return
|
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) {
|
} catch (error) {
|
||||||
setError(error.message)
|
setError(error.message)
|
||||||
Logger.error(error.message)
|
Logger.error(error.message)
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
import axios, { CancelToken, AxiosResponse } from 'axios'
|
||||||
|
import { toast } from 'react-toastify'
|
||||||
|
import isUrl from 'is-url-superb'
|
||||||
import {
|
import {
|
||||||
MetadataMarket,
|
MetadataMarket,
|
||||||
MetadataPublishFormDataset,
|
MetadataPublishFormDataset,
|
||||||
@ -6,7 +9,7 @@ import {
|
|||||||
import { toStringNoMS } from '.'
|
import { toStringNoMS } from '.'
|
||||||
import AssetModel from '../models/Asset'
|
import AssetModel from '../models/Asset'
|
||||||
import slugify from '@sindresorhus/slugify'
|
import slugify from '@sindresorhus/slugify'
|
||||||
import { DDO, MetadataAlgorithm } from '@oceanprotocol/lib'
|
import { DDO, MetadataAlgorithm, Logger } from '@oceanprotocol/lib'
|
||||||
|
|
||||||
export function transformTags(value: string): string[] {
|
export function transformTags(value: string): string[] {
|
||||||
const originalTags = value?.split(',')
|
const originalTags = value?.split(',')
|
||||||
@ -128,6 +131,60 @@ export function transformPublishFormToMetadata(
|
|||||||
return metadata
|
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(
|
export function transformPublishAlgorithmFormToMetadata(
|
||||||
{
|
{
|
||||||
name,
|
name,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user