Skip to content

Commit

Permalink
Add implementation for kapp-controller GetAvailablePackages. (#2838)
Browse files Browse the repository at this point in the history
* Add implementation for kapp-controlleg GetAvailablePackages.
  • Loading branch information
absoludity committed May 21, 2021
1 parent a908a4f commit 1f9549b
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 36 deletions.
4 changes: 3 additions & 1 deletion chart/kubeapps/templates/kubeappsapis/rbac.yaml
Expand Up @@ -16,9 +16,11 @@ metadata:
{{- end }}
rules:
# TODO: Remove in favour of user's own creds used for request.
# While developing without user auth, add the required RBAC here for the CRD group
# you're dealing with.
- apiGroups:
- ""
- "package.carvel.dev"
- "install.package.carvel.dev"
resources: ['*']
verbs: ['*']
---
Expand Down
4 changes: 2 additions & 2 deletions cmd/kubeapps-apis/Dockerfile
Expand Up @@ -15,12 +15,12 @@ RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go build \
-o /kapp-controller-packages-v1alpha1-plugin.so -buildmode=plugin \
./cmd/kubeapps-apis/plugins/kapp_controller/packages/v1alpha1/main.go
./cmd/kubeapps-apis/plugins/kapp_controller/packages/v1alpha1/*.go
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go build \
-o /helm-operator-packages-v1alpha1-plugin.so -buildmode=plugin \
./cmd/kubeapps-apis/plugins/helm_operator/packages/v1alpha1/main.go
./cmd/kubeapps-apis/plugins/helm_operator/packages/v1alpha1/*.go

# Note: unlike the other docker images for go, we cannot use scratch as the plugins
# are loaded using the dynamic linker.
Expand Down
4 changes: 2 additions & 2 deletions cmd/kubeapps-apis/Makefile
Expand Up @@ -14,8 +14,8 @@

# Build the helm and kapp package plugins with the output in the devel directory.
build-plugins:
go build -o devel/kapp-controller-packages-v1alpha1-plugin.so -buildmode=plugin plugins/kapp_controller/packages/v1alpha1/main.go
go build -o devel/helm-operator-packages-v1alpha1-plugin.so -buildmode=plugin plugins/helm_operator/packages/v1alpha1/main.go
go build -o devel/kapp-controller-packages-v1alpha1-plugin.so -buildmode=plugin plugins/kapp_controller/packages/v1alpha1/*.go
go build -o devel/helm-operator-packages-v1alpha1-plugin.so -buildmode=plugin plugins/helm_operator/packages/v1alpha1/*.go


# Ensure the required version of cli tooling in tools/tools.go is installed.
Expand Down
Expand Up @@ -31,33 +31,3 @@ func RegisterWithGRPCServer(s grpc.ServiceRegistrar) {
func RegisterHTTPHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) error {
return v1alpha1.RegisterPackagesServiceHandlerFromEndpoint(ctx, mux, endpoint, opts)
}

// Server implements the kapp-controller packages v1alpha1 interface.
type Server struct {
v1alpha1.UnimplementedPackagesServiceServer
}

// func (s *Server) GetAvailablePackages(request *v1.GetAvailablePackagesRequest, stream PackageRepositoriesService_GetAvailablePackagesServer) error {
// repo := &v1.PackageRepository{
// Name: "bitnami",
// Namespace: "kubeapps",
// }
// availablePackages := []*v1.AvailablePackage{
// {
// Name: "package-a",
// LatestVersion: "1.2.0",
// Repository: repo,
// IconUrl: "http://example.com/package-a.jpg",
// },
// {
// Name: "package-b",
// Repository: repo,
// LatestVersion: "1.4.0",
// IconUrl: "http://example.com/package-b.jpg",
// },
// }
// for _, pkg := range availablePackages {
// stream.Send(pkg)
// }
// return nil
// }
@@ -0,0 +1,70 @@
package main

import (
"context"
"fmt"

// v1 "github.com/kubeapps/kubeapps/cmd/kubeapps-api-service/kubeappsapis/core/packagerepositories/v1"
// *sigh*, seems different versions of the k8s client.go (at the time of writing, kapp-controller
// is using client-go v0.19.2) means that we can't use the client here directly, as get errors like:
/*
gitub.com/vmware-tanzu/carvel-kapp-controller@v0.18.0/pkg/client/clientset/versioned/typed/kappctrl/v1alpha1/app.go:58:5: not enough arguments in call to c.client.Get().Namespace(c.ns).Resource("apps").Name(name).VersionedParams(&options, scheme.ParameterCodec).Do
have ()
want (context.Context)
*/
// So instead we use the dynamic (untyped) client.
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"

corev1 "github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/core/packages/v1alpha1"
"github.com/kubeapps/kubeapps/cmd/kubeapps-apis/gen/plugins/kapp_controller/packages/v1alpha1"
"k8s.io/client-go/rest"
)

// Server implements the kapp-controller packages v1alpha1 interface.
type Server struct {
v1alpha1.UnimplementedPackagesServiceServer
}

// GetAvailablePackages streams the available packages based on the request.
func (s *Server) GetAvailablePackages(ctx context.Context, request *corev1.GetAvailablePackagesRequest) (*corev1.GetAvailablePackagesResponse, error) {
// TODO: replace incluster config with the user config using token from request meta.
config, err := rest.InClusterConfig()
if err != nil {
return nil, fmt.Errorf("unable to create incluster config: %w", err)
}

client, err := dynamic.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("unable to create dynamic client: %w", err)
}

packageResource := schema.GroupVersionResource{Group: "package.carvel.dev", Version: "v1alpha1", Resource: "packages"}

pkgs, err := client.Resource(packageResource).List(ctx, metav1.ListOptions{})
if err != nil {
return nil, fmt.Errorf("unable to list kapp-controller packages: %w", err)
}

responsePackages := []*corev1.AvailablePackage{}
for _, pkgUnstructured := range pkgs.Items {
pkg := &corev1.AvailablePackage{}
name, found, err := unstructured.NestedString(pkgUnstructured.Object, "spec", "publicName")
if err != nil || !found {
return nil, fmt.Errorf("required field publicName not found on kapp-controller package: %w:\n%v", err, pkgUnstructured.Object)
}
pkg.Name = name

version, found, err := unstructured.NestedString(pkgUnstructured.Object, "spec", "version")
if err != nil || !found {
return nil, fmt.Errorf("required field version not found on kapp-controller package: %w:\n%v", err, pkgUnstructured.Object)
}
pkg.Version = version
responsePackages = append(responsePackages, pkg)
}
return &corev1.GetAvailablePackagesResponse{
Packages: responsePackages,
}, nil
}
5 changes: 4 additions & 1 deletion docs/developer/manifests/values.dev.yaml
Expand Up @@ -5,6 +5,9 @@

## KubeappsAPIs parameters
##
featureFlags:
kubeappsAPIsServer: true

kubeappsapis:
## Bitnami Kubeapps-APIs image
## ref: https://hub.docker.com/r/bitnami/kubeapps-apis/tags/
Expand All @@ -31,7 +34,7 @@ kubeappsapis:
## - myRegistryKeySecretName
##
pullSecrets: []
replicaCount: 2
replicaCount: 1
## @param kubeappsapis.terminationGracePeriodSeconds The grace time period for sig term
## ref: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-execution
##
Expand Down
5 changes: 5 additions & 0 deletions script/deploy-dev.mk
Expand Up @@ -50,6 +50,11 @@ deploy-dev: deploy-dependencies deploy-dev-kubeapps
reset-dev-kubeapps:
kubectl delete namespace --wait kubeapps

# The kapp-controller support for the new Package and PackageRepository CRDs is currently
# only available in an alpha release.
deploy-kapp-controller:
kubectl --kubeconfig=${CLUSTER_CONFIG} apply -f https://raw.githubusercontent.com/vmware-tanzu/carvel-kapp-controller/develop/alpha-releases/v0.19.0-alpha.8.yml

reset-dev:
helm --kubeconfig=${CLUSTER_CONFIG} -n kubeapps delete kubeapps || true
helm --kubeconfig=${CLUSTER_CONFIG} -n dex delete dex || true
Expand Down

0 comments on commit 1f9549b

Please sign in to comment.