Skip to content

Commit

Permalink
feat: watch support kubevela Application from core.oam.dev/v1beta1 (#238
Browse files Browse the repository at this point in the history
)

* add Application API from core.oam.dev/v1beta1

both github.com/kubevela/kubevela or github.com/kubevela/kubevela-core-api has replace statement in go.mod, so copy them into third party

* feat: watch support kubevela Application from core.oam.dev/v1beta1
  • Loading branch information
howieyuen committed Feb 13, 2023
1 parent 3f37ce4 commit 32c3547
Show file tree
Hide file tree
Showing 18 changed files with 1,144 additions and 5 deletions.
7 changes: 2 additions & 5 deletions pkg/engine/operation/watch.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,12 @@ import (
"kusionstack.io/kusion/pkg/engine"
opsmodels "kusionstack.io/kusion/pkg/engine/operation/models"
"kusionstack.io/kusion/pkg/engine/printers"
"kusionstack.io/kusion/pkg/engine/printers/k8s"
"kusionstack.io/kusion/pkg/engine/runtime"
runtimeinit "kusionstack.io/kusion/pkg/engine/runtime/init"
"kusionstack.io/kusion/pkg/status"
"kusionstack.io/kusion/pkg/util/pretty"
)

var tableGenerator = printers.NewTableGenerator().With(k8s.AddHandlers)

type WatchOperation struct {
opsmodels.Operation
}
Expand Down Expand Up @@ -112,8 +109,8 @@ func (wo *WatchOperation) Watch(req *WatchRequest) error {
ready = true
} else {
// Restore to actual type
target := k8s.Convert(o)
detail, ready = tableGenerator.GenerateTable(target)
target := printers.Convert(o)
detail, ready = printers.TG.GenerateTable(target)
}

// Mark ready for breaking loop
Expand Down
23 changes: 23 additions & 0 deletions pkg/engine/printers/convertor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package printers

import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
)

type Convertor func(o *unstructured.Unstructured) runtime.Object

var convertors []Convertor

func RegisterConvertor(c Convertor) {
convertors = append(convertors, c)
}

func Convert(o *unstructured.Unstructured) runtime.Object {
for _, c := range convertors {
if target := c(o); target != nil {
return target
}
}
return nil
}
6 changes: 6 additions & 0 deletions pkg/engine/printers/k8s/convertors.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
discoveryv1 "k8s.io/api/discovery/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"

"kusionstack.io/kusion/pkg/engine/printers"
)

// APIs in core/v1
Expand Down Expand Up @@ -48,6 +50,10 @@ const (
EndpointSlice = "EndpointSlice"
)

func init() {
printers.RegisterConvertor(Convert)
}

func Convert(o *unstructured.Unstructured) runtime.Object {
switch o.GroupVersionKind().GroupVersion() {
case corev1.SchemeGroupVersion:
Expand Down
4 changes: 4 additions & 0 deletions pkg/engine/printers/k8s/printers.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ const (
nodeLabelRole = "kubernetes.io/role"
)

func init() {
printers.TG.With(AddHandlers)
}

// AddHandlers adds print handlers for default Kubernetes types dealing with internal versions.
// TODO: handle errors from Handler
func AddHandlers(h printers.PrintHandler) {
Expand Down
42 changes: 42 additions & 0 deletions pkg/engine/printers/kubevela/convertor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package kubevela

import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"

"kusionstack.io/kusion/pkg/engine/printers"
oamv1beta1 "kusionstack.io/kusion/third_party/kubevela/kubevela/apis/v1beta1"
)

// APIs in core.oam.dev/v1beta1
const (
Application = "Application"
)

func init() {
printers.RegisterConvertor(Convert)
}

func Convert(o *unstructured.Unstructured) runtime.Object {
switch o.GroupVersionKind().GroupVersion() {
case oamv1beta1.SchemeGroupVersion:
return convertOamV1beta1(o)
default:
return nil
}
}

func convertOamV1beta1(o *unstructured.Unstructured) runtime.Object {
var target runtime.Object
switch o.GetKind() {
case Application:
target = &oamv1beta1.Application{}
default:
return nil
}

if err := runtime.DefaultUnstructuredConverter.FromUnstructured(o.Object, target); err != nil {
return nil
}
return target
}
65 changes: 65 additions & 0 deletions pkg/engine/printers/kubevela/printers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package kubevela

import (
"fmt"
"strconv"
"strings"
"time"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/duration"

"kusionstack.io/kusion/pkg/engine/printers"
oamv1beta1 "kusionstack.io/kusion/third_party/kubevela/kubevela/apis/v1beta1"
)

func init() {
printers.TG.With(AddHandlers)
}

func AddHandlers(h printers.PrintHandler) {
h.TableHandler(printApplication)
}

func printApplication(obj *oamv1beta1.Application) (string, bool) {
// Component and Type
components := obj.Spec.Components
componentNames := make([]string, len(components))
componentTypes := make([]string, len(components))
for i := range components {
componentNames[i] = components[i].Name
componentTypes[i] = components[i].Type
}
componentStr := strings.Join(componentNames, ",")
typeStr := strings.Join(componentTypes, ",")

// Phase
phase := obj.Status.Phase

// Healthy and Status
services := obj.Status.Services
serviceHealths := make([]string, len(services))
serviceStatuses := make([]string, len(services))
for i := range services {
serviceHealths[i] = strconv.FormatBool(services[i].Healthy)
serviceStatuses[i] = services[i].Message
}
healthyStr := strings.Join(serviceHealths, ",")
statusStr := strings.Join(serviceStatuses, ",")

// Age
age := translateTimestampSince(obj.CreationTimestamp)

return fmt.Sprintf("Component: %s, Type: %s, Phase: %s, Healthy: %s, Status: %s, Age: %s",
componentStr, typeStr, phase, healthyStr, statusStr, age), phase == "running" && obj.Status.Workflow.Finished
}

// translateTimestampSince returns the elapsed time since timestamp in
// human-readable approximation.
func translateTimestampSince(timestamp metav1.Time) string {
if timestamp.IsZero() {
return "<unknown>"
}

return duration.HumanDuration(time.Since(timestamp.Time))
}
2 changes: 2 additions & 0 deletions pkg/engine/printers/table_generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import (
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
)

var TG = NewTableGenerator()

// TableGenerator - an interface for generating a message and ready flag provided a runtime.Object
type TableGenerator interface {
GenerateTable(obj runtime.Object) (string, bool)
Expand Down
20 changes: 20 additions & 0 deletions third_party/kubevela/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
Copyright 2022 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Package kubevela contains `Application` API
// which is copied from [kubevela](https://github.com/oam-dev/kubevela)
// and [workflow](https://github.com/kubevela/workflow).
package kubevela
Loading

0 comments on commit 32c3547

Please sign in to comment.