Skip to content

Commit

Permalink
Merge pull request #72 from galletti94/master
Browse files Browse the repository at this point in the history
UI validation - adding icon mediatype check
  • Loading branch information
kevinrizza committed Mar 19, 2019
2 parents e8f7547 + 4859fa3 commit 9c00bf4
Show file tree
Hide file tree
Showing 6 changed files with 735 additions and 6 deletions.
6 changes: 5 additions & 1 deletion operatorcourier/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,11 @@ def verify(self):
'files to bundle. Either set this or '
'use the files argument for bundle data.')
parser.add_argument('--ui_validate_io',
help='Validate bundle for operatorhub.io UI',
help='Validate bundle for operatorhub.io UI. '
'To visually confirm that your operator '
'will be displayed correctly, please visit '
'https://operatorhub.io/preview and paste '
'your operator CSV.',
action='store_true')
parser.add_argument('--validation-output', dest='validation_output',
help='A file to write validation warnings and errors to'
Expand Down
33 changes: 33 additions & 0 deletions operatorcourier/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,9 @@ def get_alm_kinds(alm_examples):
res.append(example["kind"])
return res

def is_mediatype(mediatype):
return mediatype in ["image/gif", "image/jpeg", "image/png", "image/svg+xml"]

valid = True

spec = csv["spec"]
Expand Down Expand Up @@ -470,4 +473,34 @@ def get_alm_kinds(alm_examples):
"valid capabilities level", annotations["capability"])
valid = False

# icon check
if "icon" in spec:
icons = spec["icon"]
if isinstance(icons, (list,)):
if len(icons) == 1:
icon = icons[0]
if len(icon.keys()) == 2:
if "base64data" in icon and "mediatype" in icon:
if not is_mediatype(icon["mediatype"]):
self._log_error(
"spec.icon[0].mediatype %s is not a valid mediatype. "
"It must be one of \"image/gif\", \"image/jpeg\", "
"\"image/png\", \"image/svg+xml\"", icon["mediatype"]
)
valid = False
else:
self._log_error("spec.icon[0] must contain the fields "
"\"base64data\" and \"mediatype\".")
valid = False
else:
self._log_error("spec.icon can only contain two fields: "
"\"base64data\" and \"mediatype\"")
valid = False
else:
self._log_error("spec.icon should be a singleton list")
valid = False
else:
self._log_error("spec.icon should be a list")
valid = False

return valid
335 changes: 335 additions & 0 deletions tests/test_files/bundles/verification/noicon.valid.bundle.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,335 @@
data:
clusterServiceVersions: |
- apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
alm-examples: |-
[
{
"apiVersion": "marketplace.redhat.com/v1alpha1",
"kind": "CatalogSourceConfig",
"metadata":
{
"name": "installed-upstream-community-operators",
"namespace": "marketplace"
},
"spec":
{
"targetNamespace": "local-operators",
"packages": "jaeger"
}
},
{
"apiVersion": "marketplace.redhat.com/v1alpha1",
"kind": "OperatorSource",
"metadata":
{
"name": "community-operators",
"namespace": "marketplace"
},
"spec":
{
"type": "appregistry",
"endpoint": "https://quay.io/cnr",
"registryNamespace": "community-operators",
"displayName": "Community Operators",
"publisher": "Red Hat"
}
}
]
categories: openshift required
certified: 'true'
containerImage: quay.io/openshift/origin-operator-marketplace:latest
createdAt: 2019/11/15
description: An operator to run the OpenShift marketplace
capabilities: Basic Install
repository: https://github.com/operator-framework/operator-marketplace
support: Red Hat
name: marketplace-operator.v0.0.1
namespace: placeholder
spec:
customresourcedefinitions:
owned:
- description: Represents an OperatorSource.
displayName: Operator Source
kind: OperatorSource
name: operatorsources.marketplace.redhat.com
specDescriptors:
- description: The type of the operator source.
displayName: Type
path: type
- description: Points to the remote app registry server from where operator
manifests can be fetched.
displayName: Endpoint
path: endpoint
- description: 'The namespace in app registry.
Only operator manifests under this namespace will be visible.
Please note that this is not a k8s namespace.'
displayName: Registry Namespace
path: registryNamespace
statusDescriptors:
- description: Current status of the CatalogSourceConfig
displayName: Current Phase Name
path: currentPhase.phase.name
- description: Message associated with the current status
displayName: Current Phase Message
path: currentPhase.phase.message
version: v1alpha1
- description: Represents a CatalogSourceConfig object which is used to configure
a CatalogSource.
displayName: Catalog Source Config
kind: CatalogSourceConfig
name: catalogsourceconfigs.marketplace.redhat.com
specDescriptors:
- description: The namespace where the operators will be enabled.
displayName: Target Namespace
path: targetNamespace
- description: List of operator(s) which will be enabled in the target namespace
displayName: Packages
path: packages
statusDescriptors:
- description: Current status of the CatalogSourceConfig
displayName: Current Phase Name
path: currentPhase.phase.name
- description: Message associated with the current status
displayName: Current Phase Message
path: currentPhase.phase.message
version: v1alpha1
description: Marketplace is a gateway for users to consume off-cluster Operators
which will include Red Hat, ISV, optional OpenShift and community content.
displayName: marketplace-operator
install:
spec:
clusterPermissions:
- rules:
- apiGroups:
- marketplace.redhat.com
resources:
- '*'
verbs:
- '*'
- apiGroups:
- ''
resources:
- services
- configmaps
verbs:
- '*'
- apiGroups:
- operators.coreos.com
resources:
- catalogsources
verbs:
- '*'
serviceAccountName: marketplace-operator
deployments:
- name: marketplace-operator
spec:
replicas: 1
selector:
matchLabels:
name: marketplace-operator
template:
metadata:
labels:
name: marketplace-operator
name: marketplace-operator
spec:
containers:
- command:
- marketplace-operator
env:
- name: WATCH_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: OPERATOR_NAME
value: marketplace-operator
image: quay.io/openshift/origin-operator-marketplace:latest
imagePullPolicy: Always
livenessProbe:
httpGet:
path: /healthz
port: 8080
name: marketplace-operator
ports:
- containerPort: 60000
name: metrics
- containerPort: 8080
name: healthz
readinessProbe:
httpGet:
path: /healthz
port: 8080
serviceAccountName: marketplace-operator
strategy: deployment
installModes:
- supported: true
type: OwnNamespace
- supported: true
type: SingleNamespace
- supported: false
type: MultiNamespace
- supported: true
type: AllNamespaces
keywords:
- marketplace
- catalog
- olm
- admin
labels:
name: marketplace-operator
links:
- name: Markplace Operator Source Code
url: https://github.com/operator-framework/operator-marketplace
maintainers:
- email: aos-marketplace@redhat.com
name: AOS Marketplace Team
maturity: alpha
provider:
name: Red Hat
selector:
matchLabels:
name: marketplace-operator
version: 0.0.1
customResourceDefinitions: |
- apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
description: Represents a CatalogSourceConfig.
displayName: Catalog Source Config
name: catalogsourceconfigs.marketplace.redhat.com
spec:
additionalPrinterColumns:
- JSONPath: .spec.targetNamespace
description: The namespace where the operators will be enabled
name: TargetNamespace
type: string
- JSONPath: .spec.packages
description: List of operator(s) which will be enabled in the target namespace
name: Packages
type: string
- JSONPath: .status.currentPhase.phase.name
description: Current status of the CatalogSourceConfig
name: Status
type: string
- JSONPath: .status.currentPhase.phase.message
description: Message associated with the current status
name: Message
type: string
- JSONPath: .metadata.creationTimestamp
name: Age
type: date
group: marketplace.redhat.com
names:
kind: CatalogSourceConfig
listKind: CatalogSourceConfigList
plural: catalogsourceconfigs
shortNames:
- csc
singular: catalogsourceconfig
scope: Namespaced
validation:
openAPIV3Schema:
properties:
spec:
description: Spec for a CatalogSourceConfig
properties:
packages:
description: Comma separated list of operator(s) without spaces
which will be enabled in the target namespace
type: string
targetNamespace:
description: The namespace where the operators will be enabled
type: string
required:
- targetNamespace
- packages
type: object
version: v1alpha1
- apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
description: Represents an OperatorSource.
displayName: Operator Source
name: operatorsources.marketplace.redhat.com
spec:
additionalPrinterColumns:
- JSONPath: .spec.type
description: The type of the OperatorSource
name: Type
type: string
- JSONPath: .spec.endpoint
description: The endpoint of the OperatorSource
name: Endpoint
type: string
- JSONPath: .spec.registryNamespace
description: App registry namespace
name: Registry
type: string
- JSONPath: .spec.displayName
description: Display (pretty) name to indicate the OperatorSource's name
name: DisplayName
type: string
- JSONPath: .spec.publisher
description: Publisher of the OperatorSource
name: Publisher
type: string
- JSONPath: .status.currentPhase.phase.name
description: Current status of the OperatorSource
name: Status
type: string
- JSONPath: .status.currentPhase.phase.message
description: Message associated with the current status
name: Message
type: string
- JSONPath: .metadata.creationTimestamp
name: Age
type: date
group: marketplace.redhat.com
names:
kind: OperatorSource
listKind: OperatorSourceList
plural: operatorsources
shortNames:
- opsrc
singular: operatorsource
scope: Namespaced
validation:
openAPIV3Schema:
properties:
spec:
description: Spec for an OperatorSource.
properties:
endpoint:
description: Points to the remote app registry server from where
operator manifests can be fetched.
type: string
registryNamespace:
description: 'The namespace in app registry.
Only operator manifests under this namespace will be visible.
Please note that this is not a k8s namespace.'
type: string
type:
description: The type of the OperatorSource
pattern: appregistry
type: string
required:
- type
- endpoint
- registryNamespace
type: object
version: v1alpha1
packages: |
- channels:
- currentCSV: marketplace-operator.v0.0.1
name: alpha
packageName: marketplace
Loading

0 comments on commit 9c00bf4

Please sign in to comment.