github.com/operator-framework/operator-lifecycle-manager@v0.30.0/doc/contributors/design-proposals/operator-logos.md (about)

     1  # Operator Package Logos
     2  
     3  Status: In Progress
     4  
     5  Version: Alpha
     6  
     7  Implementation Owner: [@alecmerdler](github.com/alecmerdler)
     8  
     9  # Motivation
    10  
    11  Having logo icons for Operator packages is important. Currently, we include the base64-encoded representation of the image data in the `PackageManifest` API object itself. This data is not small. Even for a trivial number of Operator packages, the API response is quite large, which is a poor experience for clients. For example, a `PackageManifestList` with 65 Operators is ~1.9MB _with logos_; removing the logos reduces the size to ~450 KB.
    12  
    13  # Proposed Changes
    14  
    15  Add a new [API subresource](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#types-kinds) to `PackageManifest` which serves the associated logo image file.
    16  
    17  ## Implementation
    18  
    19  Add subresource following `pods/log` example in [core Kubernetes apiserver code](https://sourcegraph.com/github.com/kubernetes/kubernetes@master/-/blob/pkg/registry/core/rest/storage_core.go#L230).
    20  
    21  
    22  **Add subresource to both API groups:**
    23  
    24  `pkg/package-server/apiserver/generic/storage.go`
    25  ```go
    26  func BuildStorage(providers *ProviderConfig) []generic.APIGroupInfo {
    27  	// Build storage for packages.operators.coreos.com
    28  	operatorInfo := generic.NewDefaultAPIGroupInfo(v1.Group, Scheme, metav1.ParameterCodec, Codecs)
    29  	operatorStorage := storage.NewStorage(v1.Resource("packagemanifests"), providers.Provider, Scheme)
    30  	logoStorage := storage.NewLogoStorage(providers.Provider)
    31  	operatorResources := map[string]rest.Storage{
    32  		"packagemanifests":      operatorStorage,
    33  		"packagemanifests/logo": logoStorage,
    34  	}
    35  	operatorInfo.VersionedResourcesStorageMap[v1.Version] = operatorResources
    36  
    37  	// Build storage for packages.apps.redhat.com
    38  	appInfo := generic.NewDefaultAPIGroupInfo(v1alpha1.Group, Scheme, metav1.ParameterCodec, Codecs)
    39  
    40  	// Use storage for package.operators.coreos.com since types are identical
    41  	appResources := map[string]rest.Storage{
    42  		"packagemanifests":      operatorStorage,
    43  		"packagemanifests/logo": logoStorage,
    44  	}
    45  	appInfo.VersionedResourcesStorageMap[v1alpha1.Version] = appResources
    46  
    47  	return []generic.APIGroupInfo{
    48  		operatorInfo,
    49  		appInfo,
    50  	}
    51  }
    52  ```
    53  
    54  **Implement logo storage struct**
    55  
    56  `pkg/package-server/storage/subresources.go`
    57  ```go
    58  type LogoStorage struct {
    59  	prov provider.PackageManifestProvider
    60  }
    61  
    62  var _ rest.Connecter = &LogoStorage{}
    63  var _ rest.StorageMetadata = &LogoStorage{}
    64  
    65  // Implement the necessary methods below...
    66  ```
    67  
    68  # Next Stage
    69  
    70  Once the logos are being served from the subresource, console will be updated to fetch the images from those endpoints. Then we can remove the `icon` field completely from the `PackageManifest` object and benefit from the size reduction.
    71