From 5461d183f8af52472d5a7eb06e9d85fc82eedde0 Mon Sep 17 00:00:00 2001 From: "Jose R. Gonzalez" Date: Thu, 24 Jul 2025 10:29:59 -0500 Subject: [PATCH] Add minimum required component fields and remove some read-only fields Signed-off-by: Jose R. Gonzalez --- internal/discovery/discovery.go | 5 +- internal/genpyxis/fragments.graphql | 3 ++ internal/genpyxis/generated.go | 33 ++++++++++++ internal/resource/component.go | 39 ++++++-------- internal/resource/component_container.go | 67 ++++++++++++++++++++++++ internal/resource/component_helmchart.go | 24 ++++++--- internal/resource/resource.go | 1 - internal/resource/resource_test.go | 6 --- 8 files changed, 136 insertions(+), 42 deletions(-) diff --git a/internal/discovery/discovery.go b/internal/discovery/discovery.go index 7c72f2f..543e79a 100644 --- a/internal/discovery/discovery.go +++ b/internal/discovery/discovery.go @@ -43,9 +43,8 @@ func ComponentsFromDiscoveryManifest(manifest discovery.Manifest) ([]*resource.C OSContentType: resource.ContentTypeUBI, Type: resource.ContainerTypeContainer, }, - Name: mostCommonContainerName, - ProjectStatus: resource.ProjectStatusActive, - Type: resource.ComponentTypeContainer, + Name: mostCommonContainerName, + Type: resource.ComponentTypeContainer, } components = append(components, &c) diff --git a/internal/genpyxis/fragments.graphql b/internal/genpyxis/fragments.graphql index 2a792f8..9a99794 100644 --- a/internal/genpyxis/fragments.graphql +++ b/internal/genpyxis/fragments.graphql @@ -66,6 +66,7 @@ fragment ComponentSupportedFields on CertificationProject { long_description github_usernames distribution_method + application_categories } container { isv_pid @@ -78,6 +79,8 @@ fragment ComponentSupportedFields on CertificationProject { distribution_method hosted_registry os_content_type + application_categories + build_categories } contacts { email_address diff --git a/internal/genpyxis/generated.go b/internal/genpyxis/generated.go index 138e79e..1f3e261 100644 --- a/internal/genpyxis/generated.go +++ b/internal/genpyxis/generated.go @@ -691,6 +691,10 @@ type ComponentSupportedFieldsContainerCertProjectContainer struct { Hosted_registry bool `json:"hosted_registry"` // OS Content Type. Os_content_type string `json:"os_content_type"` + // The application categories (types). + Application_categories []string `json:"application_categories"` + // This value of this field is related to certProject.type field. See ISV-2012. + Build_categories string `json:"build_categories"` } // GetIsv_pid returns ComponentSupportedFieldsContainerCertProjectContainer.Isv_pid, and is useful for accessing the field via an interface. @@ -739,6 +743,16 @@ func (v *ComponentSupportedFieldsContainerCertProjectContainer) GetOs_content_ty return v.Os_content_type } +// GetApplication_categories returns ComponentSupportedFieldsContainerCertProjectContainer.Application_categories, and is useful for accessing the field via an interface. +func (v *ComponentSupportedFieldsContainerCertProjectContainer) GetApplication_categories() []string { + return v.Application_categories +} + +// GetBuild_categories returns ComponentSupportedFieldsContainerCertProjectContainer.Build_categories, and is useful for accessing the field via an interface. +func (v *ComponentSupportedFieldsContainerCertProjectContainer) GetBuild_categories() string { + return v.Build_categories +} + // ComponentSupportedFieldsHelm_chartCertProjectHelmChart includes the requested fields of the GraphQL type CertProjectHelmChart. // The GraphQL type's documentation follows. // @@ -756,6 +770,8 @@ type ComponentSupportedFieldsHelm_chartCertProjectHelmChart struct { Github_usernames []string `json:"github_usernames"` // How your Helm Chart is distributed. Distribution_method string `json:"distribution_method"` + // The application categories (types). + Application_categories []string `json:"application_categories"` } // GetChart_name returns ComponentSupportedFieldsHelm_chartCertProjectHelmChart.Chart_name, and is useful for accessing the field via an interface. @@ -788,6 +804,11 @@ func (v *ComponentSupportedFieldsHelm_chartCertProjectHelmChart) GetDistribution return v.Distribution_method } +// GetApplication_categories returns ComponentSupportedFieldsHelm_chartCertProjectHelmChart.Application_categories, and is useful for accessing the field via an interface. +func (v *ComponentSupportedFieldsHelm_chartCertProjectHelmChart) GetApplication_categories() []string { + return v.Application_categories +} + // ComponentsForListingFind_product_listing_certification_projectsCertificationProjectPaginatedResponse includes the requested fields of the GraphQL type CertificationProjectPaginatedResponse. type ComponentsForListingFind_product_listing_certification_projectsCertificationProjectPaginatedResponse struct { Data []*ComponentSupportedFields `json:"data"` @@ -2540,6 +2561,7 @@ fragment ComponentSupportedFields on CertificationProject { long_description github_usernames distribution_method + application_categories } container { isv_pid @@ -2552,6 +2574,8 @@ fragment ComponentSupportedFields on CertificationProject { distribution_method hosted_registry os_content_type + application_categories + build_categories } contacts { email_address @@ -2760,6 +2784,7 @@ fragment ComponentSupportedFields on CertificationProject { long_description github_usernames distribution_method + application_categories } container { isv_pid @@ -2772,6 +2797,8 @@ fragment ComponentSupportedFields on CertificationProject { distribution_method hosted_registry os_content_type + application_categories + build_categories } contacts { email_address @@ -2984,6 +3011,7 @@ fragment ComponentSupportedFields on CertificationProject { long_description github_usernames distribution_method + application_categories } container { isv_pid @@ -2996,6 +3024,8 @@ fragment ComponentSupportedFields on CertificationProject { distribution_method hosted_registry os_content_type + application_categories + build_categories } contacts { email_address @@ -3066,6 +3096,7 @@ fragment ComponentSupportedFields on CertificationProject { long_description github_usernames distribution_method + application_categories } container { isv_pid @@ -3078,6 +3109,8 @@ fragment ComponentSupportedFields on CertificationProject { distribution_method hosted_registry os_content_type + application_categories + build_categories } contacts { email_address diff --git a/internal/resource/component.go b/internal/resource/component.go index 50beaec..6d14c78 100644 --- a/internal/resource/component.go +++ b/internal/resource/component.go @@ -3,27 +3,25 @@ package resource import "time" type Component struct { - ID string `json:"_id,omitempty"` - CertificationDate *time.Time `json:"certification_date,omitempty"` - CertificationLevel string `json:"certification_level,omitempty"` - CertificationStatus string `json:"certification_status,omitempty"` - Contacts []ComponentContacts `json:"contacts,omitempty"` - Container *ContainerComponent `json:"container,omitempty"` - Name string `json:"name,omitempty"` - OperatorDistribution string `json:"operator_distribution,omitempty"` - OrgID int `json:"org_id,omitempty"` - ProjectStatus ComponentProjectStatus `json:"project_status,omitempty" jsonschema:"enum=active,enum=archive"` - PublishedBy string `json:"published_by,omitempty"` - Badges []string `json:"badges,omitempty"` - Type ComponentType `json:"type,omitempty" jsonschema:"enum=Containers,enum=Helm Chart,enum=OpenShift-cnf"` - CreationDate *time.Time `json:"creation_date,omitempty"` - HelmChart *HelmChartComponent `json:"helm_chart,omitempty"` - LastUpdateDate *time.Time `json:"last_update_date,omitempty"` + ID string `json:"_id,omitempty"` + CertificationDate *time.Time `json:"certification_date,omitempty"` + CertificationLevel string `json:"certification_level,omitempty"` + Contacts []ComponentContacts `json:"contacts,omitempty"` + Container *ContainerComponent `json:"container,omitempty"` + Name string `json:"name,omitempty"` + OperatorDistribution string `json:"operator_distribution,omitempty"` + OrgID int `json:"org_id,omitempty"` + PublishedBy string `json:"published_by,omitempty"` + Badges []string `json:"badges,omitempty"` + Type ComponentType `json:"type,omitempty" jsonschema:"enum=Containers,enum=Helm Chart,enum=OpenShift-cnf"` + CreationDate *time.Time `json:"creation_date,omitempty"` + HelmChart *HelmChartComponent `json:"helm_chart,omitempty"` + LastUpdateDate *time.Time `json:"last_update_date,omitempty"` } type ComponentContacts struct { EmailAddress string `json:"email_address,omitempty"` - Type string `json:"type,omitempty"` + Type string `json:"type,omitempty" jsonschema:"enum=Technical contact"` } type ComponentType = string @@ -39,10 +37,3 @@ const ( // ComponentTypeOpenStackAppContainer ComponentType = "OpenStack-app-container" // ComponentTypeRHEL ComponentType = "RHEL" ) - -type ComponentProjectStatus = string - -const ( - ProjectStatusActive ComponentProjectStatus = "active" - ProjectStatusArchived ComponentProjectStatus = "archived" -) diff --git a/internal/resource/component_container.go b/internal/resource/component_container.go index 5927d73..17e3b78 100644 --- a/internal/resource/component_container.go +++ b/internal/resource/component_container.go @@ -1,6 +1,19 @@ package resource +type BuildCategory string + +const ( + BuildCategoryStandaloneImage BuildCategory = "Standalone image" + BuildCategoryComponentImage BuildCategory = "Component image" + BuildCategoryOperatorImage BuildCategory = "Operator image" + BuildCategoryOperatorBundle BuildCategory = "Operator bundle" +) + type ContainerComponent struct { + ApplicationCategories []ApplicationCategory `json:"application_categories,omitempty" jsonschema:"maxItems=3,enum=Accounting,enum=AI / Machine learning,enum=API Management,enum=Application Delivery,enum=Application Server,enum=Automation,enum=Backup & Recovery,enum=Business Intelligence,enum=Business Process Management,enum=Capacity Management,enum=Cloud Management,enum=Collaboration/Groupware/Messaging,enum=Configuration Management,enum=Console,enum=Container Platform / Management,enum=Content Management/Authoring,enum=Customer Relationship Management,enum=Dashboard,enum=Database & Data Management,enum=Data Store,enum=Developer Tools,enum=Enterprise Resource Planning,enum=Identity Management,enum=Integration,enum=Logging,enum=Logging & Metrics,enum=Management,enum=Messaging,enum=Metrics,enum=Migration,enum=Middleware,enum=Mobile Application Development Platform (MADP),enum=Monitoring,enum=Network Management,enum=Networking,enum=Observability,enum=Other,enum=Operating System,enum=Performance Management,enum=Plugin,enum=Policy Enforcement,enum=Programming Languages & Runtimes,enum=Scheduling,enum=Search,enum=Security,enum=Storage,enum=Tracing,enum=Virtualization Platform,enum=Web Services"` + // NOTE: this is plural in the json and in the API spec, but doesn't + // actually contain multiple values. + BuildCategory BuildCategory `json:"build_categories,omitempty" jsonschema:"enum=Standalone image,enum=Component image,enum=Operator image,enum=Operator bundle"` DistributionMethod ContainerDistributionMethod `json:"distribution_method,omitempty" jsonschema:"enum=rhcc,enum=external,enum=non_registry,enum=marketplace_only"` PID string `json:"isv_pid,omitempty"` OSContentType ContainerComponentContentType `json:"os_content_type,omitempty" jsonschema:"enum=Red Hat Enterprise Linux,enum=Red Hat Universal Base Image (UBI),enum=Operator Bundle Image,enum=Scratch Image"` @@ -48,3 +61,57 @@ const ( ReleaseCategoryGA ReleaseCategory = "Generally Available" ReleaseCategoryBeta ReleaseCategory = "Beta" ) + +type ApplicationCategory = string + +const ( + ApplicationCategoryAccounting ApplicationCategory = "Accounting" + ApplicationCategoryAIML ApplicationCategory = "AI / Machine learning" + ApplicationCategoryAPIManagement ApplicationCategory = "API Management" + ApplicationCategoryApplicationDelivery ApplicationCategory = "Application Delivery" + ApplicationCategoryApplicationServer ApplicationCategory = "Application Server" + ApplicationCategoryAutomation ApplicationCategory = "Automation" + ApplicationCategoryBackupRecovery ApplicationCategory = "Backup & Recovery" + ApplicationCategoryBusinessIntelligence ApplicationCategory = "Business Intelligence" + ApplicationCategoryBusinessProcessManagement ApplicationCategory = "Business Process Management" + ApplicationCategoryCapacityManagement ApplicationCategory = "Capacity Management" + ApplicationCategoryCloudManagement ApplicationCategory = "Cloud Management" + ApplicationCategoryCollaborationGroupwareMessaging ApplicationCategory = "Collaboration/Groupware/Messaging" + ApplicationCategoryConfigurationManagement ApplicationCategory = "Configuration Management" + ApplicationCategoryConsole ApplicationCategory = "Console" + ApplicationCategoryContainerPlatformManagement ApplicationCategory = "Container Platform / Management" + ApplicationCategoryContentManagementAuthoring ApplicationCategory = "Content Management/Authoring" + ApplicationCategoryCRM ApplicationCategory = "Customer Relationship Management" + ApplicationCategoryDashboard ApplicationCategory = "Dashboard" + ApplicationCategoryDatabaseDataManagement ApplicationCategory = "Database & Data Management" + ApplicationCategoryDataStore ApplicationCategory = "Data Store" + ApplicationCategoryDeveloperTools ApplicationCategory = "Developer Tools" + ApplicationCategoryERP ApplicationCategory = "Enterprise Resource Planning" + ApplicationCategoryIdentityManagement ApplicationCategory = "Identity Management" + ApplicationCategoryIntegration ApplicationCategory = "Integration" + ApplicationCategoryLogging ApplicationCategory = "Logging" + ApplicationCategoryLoggingMetrics ApplicationCategory = "Logging & Metrics" + ApplicationCategoryManagement ApplicationCategory = "Management" + ApplicationCategoryMessaging ApplicationCategory = "Messaging" + ApplicationCategoryMetrics ApplicationCategory = "Metrics" + ApplicationCategoryMigration ApplicationCategory = "Migration" + ApplicationCategoryMiddleware ApplicationCategory = "Middleware" + ApplicationCategoryMADP ApplicationCategory = "Mobile Application Development Platform (MADP)" + ApplicationCategoryMonitoring ApplicationCategory = "Monitoring" + ApplicationCategoryNetworkManagement ApplicationCategory = "Network Management" + ApplicationCategoryNetworking ApplicationCategory = "Networking" + ApplicationCategoryObservability ApplicationCategory = "Observability" + ApplicationCategoryOther ApplicationCategory = "Other" + ApplicationCategoryOS ApplicationCategory = "Operating System" + ApplicationCategoryPerformanceManagement ApplicationCategory = "Performance Management" + ApplicationCategoryPlugin ApplicationCategory = "Plugin" + ApplicationCategoryPolicyEnforcement ApplicationCategory = "Policy Enforcement" + ApplicationCategoryProgLangsRuntimes ApplicationCategory = "Programming Languages & Runtimes" + ApplicationCategoryScheduling ApplicationCategory = "Scheduling" + ApplicationCategorySearch ApplicationCategory = "Search" + ApplicationCategorySecurity ApplicationCategory = "Security" + ApplicationCategoryStorage ApplicationCategory = "Storage" + ApplicationCategoryTracing ApplicationCategory = "Tracing" + ApplicationCategoryVirtualizationPlatform ApplicationCategory = "Virtualization Platform" + ApplicationCategoryWebServices ApplicationCategory = "Web Services" +) diff --git a/internal/resource/component_helmchart.go b/internal/resource/component_helmchart.go index f998159..9f8a970 100644 --- a/internal/resource/component_helmchart.go +++ b/internal/resource/component_helmchart.go @@ -1,12 +1,20 @@ package resource -type HelmChartDistributionMethod = string - type HelmChartComponent struct { - ChartName string `json:"chart_name,omitempty"` - Repository string `json:"repository,omitempty"` - ShortDescription string `json:"short_description,omitempty"` - LongDescription string `json:"long_description,omitempty"` - GitHubUsernames []string `json:"github_usernames,omitempty"` - DistributionMethod string `json:"distribution_method,omitempty"` + ApplicationCategories []ApplicationCategory `json:"application_categories,omitempty" jsonschema:"maxItems=3,enum=Accounting,enum=AI / Machine learning,enum=API Management,enum=Application Delivery,enum=Application Server,enum=Automation,enum=Backup & Recovery,enum=Business Intelligence,enum=Business Process Management,enum=Capacity Management,enum=Cloud Management,enum=Collaboration/Groupware/Messaging,enum=Configuration Management,enum=Console,enum=Container Platform / Management,enum=Content Management/Authoring,enum=Customer Relationship Management,enum=Dashboard,enum=Database & Data Management,enum=Data Store,enum=Developer Tools,enum=Enterprise Resource Planning,enum=Identity Management,enum=Integration,enum=Logging,enum=Logging & Metrics,enum=Management,enum=Messaging,enum=Metrics,enum=Migration,enum=Middleware,enum=Mobile Application Development Platform (MADP),enum=Monitoring,enum=Network Management,enum=Networking,enum=Observability,enum=Other,enum=Operating System,enum=Performance Management,enum=Plugin,enum=Policy Enforcement,enum=Programming Languages & Runtimes,enum=Scheduling,enum=Search,enum=Security,enum=Storage,enum=Tracing,enum=Virtualization Platform,enum=Web Services"` + ChartName string `json:"chart_name,omitempty"` + Repository string `json:"repository,omitempty"` + ShortDescription string `json:"short_description,omitempty"` + LongDescription string `json:"long_description,omitempty"` + GitHubUsernames []string `json:"github_usernames,omitempty"` + DistributionMethod HelmChartDistributionMethod `json:"distribution_method,omitempty" jsonschema:"enum=redhat,enum=external,enum=undistributed"` } + +// HelmChartDistributionMethod is a string alias for the distribution method of a Helm chart. +type HelmChartDistributionMethod = string + +const ( + HelmChartDistributionMethodRedHat HelmChartDistributionMethod = "redhat" + HelmChartDistributionMethodExternal HelmChartDistributionMethod = "external" + HelmChartDistributionMethodUndistributed HelmChartDistributionMethod = "undistributed" +) diff --git a/internal/resource/resource.go b/internal/resource/resource.go index 7caf211..3c80a5f 100644 --- a/internal/resource/resource.go +++ b/internal/resource/resource.go @@ -41,7 +41,6 @@ func (d *ProductListingDeclaration) Sanitize() { if c := d.With.Components[i].Container; c != nil { c.PID = "" } - d.With.Components[i].ProjectStatus = "active" d.With.Components[i].CreationDate = nil d.With.Components[i].LastUpdateDate = nil d.With.Components[i].CertificationDate = nil diff --git a/internal/resource/resource_test.go b/internal/resource/resource_test.go index 26a057a..716d4b5 100644 --- a/internal/resource/resource_test.go +++ b/internal/resource/resource_test.go @@ -31,7 +31,6 @@ var _ = Describe("Resource", func() { CertificationDate: &time.Time{}, Name: "cname", OrgID: 1234, - ProjectStatus: "unset", Type: resource.ComponentTypeContainer, CreationDate: &time.Time{}, LastUpdateDate: &time.Time{}, @@ -61,11 +60,6 @@ var _ = Describe("Resource", func() { Expect(c.OrgID).To(BeZero()) } }) - It("should reset the component statuses", func() { - for _, c := range declaration.With.Components { - Expect(c.ProjectStatus).To(Equal(resource.ProjectStatusActive)) - } - }) It("should leave component information intact", func() { Expect(declaration.Spec.Name).To(Equal("test-fixture")) Expect(declaration.Spec.Type).To(Equal(resource.ProductListingTypeContainerStack))