Skip to content
This repository has been archived by the owner on Mar 16, 2024. It is now read-only.

Commit

Permalink
Merge pull request #219 from ibuildthecloud/ui-bugs
Browse files Browse the repository at this point in the history
Fix ui issues
  • Loading branch information
ibuildthecloud authored Jun 21, 2022
2 parents 6f81719 + b49f146 commit 6ef8ce8
Show file tree
Hide file tree
Showing 13 changed files with 139 additions and 48 deletions.
8 changes: 4 additions & 4 deletions docs/docs/100-Reference/01-command-line/acorn_build.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ acorn build .
### Options

```
-f, --file string Name of the build file (default "DIRECTORY/acorn.cue")
-h, --help help for build
-p, --platforms strings Target platforms (form os/arch[/variant][:osversion] example linux/amd64)
-t, --tag strings Apply a tag to the final build
-f, --file string Name of the build file (default "DIRECTORY/acorn.cue")
-h, --help help for build
-p, --platform strings Target platforms (form os/arch[/variant][:osversion] example linux/amd64)
-t, --tag strings Apply a tag to the final build
```

### Options inherited from parent commands
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ require (
k8s.io/apimachinery v0.24.2
k8s.io/apiserver v0.24.2
k8s.io/client-go v12.0.0+incompatible
k8s.io/klog v1.0.0
k8s.io/klog/v2 v2.60.1
k8s.io/kube-aggregator v0.24.2
k8s.io/kube-openapi v0.0.0-20220413171646-5e7f5fdc6da6
k8s.io/kubectl v0.24.2
Expand Down Expand Up @@ -190,8 +192,6 @@ require (
k8s.io/apiextensions-apiserver v0.24.0 // indirect
k8s.io/component-base v0.24.2 // indirect
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect
k8s.io/klog v1.0.0 // indirect
k8s.io/klog/v2 v2.60.1 // indirect
mvdan.cc/sh/v3 v3.4.1 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 // indirect
sigs.k8s.io/cli-utils v0.27.0 // indirect
Expand Down
11 changes: 6 additions & 5 deletions pkg/apis/ui.acorn.io/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@ type ClusterSpec struct {
}

type ClusterStatus struct {
Available bool `json:"available"`
Installed bool `json:"installed"`
Error string `json:"error,omitempty"`
Provider string `json:"provider"`
Info *apiv1.InfoSpec `json:"info,omitempty"`
Namespaces []string `json:"namespaces,omitempty"`
Available bool `json:"available"`
Installed bool `json:"installed"`
Error string `json:"error,omitempty"`
Provider string `json:"provider"`
Info *apiv1.InfoSpec `json:"info,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand Down
5 changes: 5 additions & 0 deletions pkg/apis/ui.acorn.io/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions pkg/cli/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ acorn build .`,
}

type Build struct {
File string `short:"f" usage:"Name of the build file" default:"DIRECTORY/acorn.cue"`
Tag []string `short:"t" usage:"Apply a tag to the final build"`
Platforms []string `short:"p" usage:"Target platforms (form os/arch[/variant][:osversion] example linux/amd64)"`
File string `short:"f" usage:"Name of the build file" default:"DIRECTORY/acorn.cue"`
Tag []string `short:"t" usage:"Apply a tag to the final build"`
Platform []string `short:"p" usage:"Target platforms (form os/arch[/variant][:osversion] example linux/amd64)"`
}

func (s *Build) Run(cmd *cobra.Command, args []string) error {
Expand All @@ -47,7 +47,7 @@ func (s *Build) Run(cmd *cobra.Command, args []string) error {
return err
}

platforms, err := build.ParsePlatforms(s.Platforms)
platforms, err := build.ParsePlatforms(s.Platform)
if err != nil {
return err
}
Expand Down
11 changes: 10 additions & 1 deletion pkg/install/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"embed"
"encoding/json"
"fmt"
"io"
"os"
"strings"

Expand All @@ -29,6 +30,9 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/klog"
klogv2 "k8s.io/klog/v2"
v1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)
Expand Down Expand Up @@ -91,6 +95,11 @@ func DefaultImage() string {
}

func Install(ctx context.Context, image string, opts *Options) error {
// I don't want these errors on the screen. Probably a better way to do this.
klog.SetOutput(io.Discard)
klogv2.SetOutput(io.Discard)
utilruntime.ErrorHandlers = nil

opts = opts.complete()
if opts.OutputFormat != "" {
return printObject(image, opts)
Expand Down Expand Up @@ -118,7 +127,7 @@ func Install(ctx context.Context, image string, opts *Options) error {
}
s.Success()

s = opts.Progress.New("Installing APIServer and Controller")
s = opts.Progress.New(fmt.Sprintf("Installing APIServer and Controller (image %s)", image))
if err := applyDeployments(image, *opts.APIServerReplicas, *opts.ControllerReplicas, apply); err != nil {
return s.Fail(err)
}
Expand Down
11 changes: 10 additions & 1 deletion pkg/tables/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,10 @@ func NewConverter(tableDef [][]string) (*Converter, error) {
}

func (c Converter) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) {
var rows []metav1.TableRow
var (
rows []metav1.TableRow
listMeta metav1.ListMeta
)

appendRow := func(obj runtime.Object) error {
out := &bytes.Buffer{}
Expand Down Expand Up @@ -81,11 +84,17 @@ func (c Converter) ConvertToTable(ctx context.Context, object runtime.Object, ta
if err != nil {
return nil, err
}
if l, err := meta.ListAccessor(object); err == nil {
listMeta.ResourceVersion = l.GetResourceVersion()
listMeta.Continue = l.GetContinue()
listMeta.RemainingItemCount = l.GetRemainingItemCount()
}
} else if err := appendRow(object); err != nil {
return nil, err
}

return &metav1.Table{
ListMeta: listMeta,
ColumnDefinitions: c.colDefs,
Rows: rows,
}, nil
Expand Down
11 changes: 10 additions & 1 deletion pkg/term/spinner.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ func (b *Builder) New(msg string) progress.Progress {
type Spinner struct {
spinner *pterm.SpinnerPrinter
text string
lastMsg string
}

func NewSpinner(text string) *Spinner {
Expand All @@ -56,7 +57,15 @@ func NewSpinner(text string) *Spinner {
}

func (s *Spinner) Infof(format string, v ...interface{}) {
s.spinner.UpdateText(fmt.Sprintf(s.text+": "+strings.TrimSpace(format), v...))
msg := strings.TrimSpace(fmt.Sprintf(s.text+": "+format, v...))
if width := pterm.GetTerminalWidth(); width > 6 && len(msg)+6 > width {
msg = msg[:width-6]
}
if s.lastMsg == msg {
return
}
s.lastMsg = msg
s.spinner.UpdateText(msg)
}

func (s *Spinner) Fail(err error) error {
Expand Down
100 changes: 78 additions & 22 deletions pkg/ui/server/resources/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,60 +2,94 @@ package cluster

import (
"context"
"fmt"
"os"
"sort"
"strings"
"sync"
"time"

ui_acorn_io "github.com/acorn-io/acorn/pkg/apis/ui.acorn.io"
uiv1 "github.com/acorn-io/acorn/pkg/apis/ui.acorn.io/v1"
"github.com/acorn-io/acorn/pkg/client"
"github.com/acorn-io/acorn/pkg/labels"
detector "github.com/rancher/kubernetes-provider-detector"
apierror "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/kubernetes"
)

var (
clusterList []uiv1.Cluster
ignoreNamespace = map[string]bool{
"kube-node-lease": true,
"kube-public": true,
}
)

func GetCluster(ctx context.Context, name string) (*uiv1.Cluster, error) {
clusters, err := listClusters(ctx, name)
clusters, err := ListClusters(ctx)
if err != nil {
return nil, err
}
if len(clusters) == 0 {
return nil, apierror.NewNotFound(schema.GroupResource{
Group: ui_acorn_io.Group,
Resource: "clusters",
}, name)
for _, cluster := range clusters {
if cluster.Name == name {
return &cluster, nil
}
}
return &clusters[0], nil
return nil, apierror.NewNotFound(schema.GroupResource{
Group: ui_acorn_io.Group,
Resource: "clusters",
}, name)
}

func GetConfig(name string) (*ClusterConfig, error) {
configs, err := clusters(os.Getenv("KUBECONFIG"), name)
configs, err := clusters(os.Getenv("KUBECONFIG"))
if err != nil {
return nil, err
}
if len(configs) == 0 {
return nil, apierror.NewNotFound(schema.GroupResource{
Group: ui_acorn_io.Group,
Resource: "clusters",
}, name)
for _, config := range configs {
if config.Name == name {
return &config, nil
}
}
return &configs[0], nil
return nil, apierror.NewNotFound(schema.GroupResource{
Group: ui_acorn_io.Group,
Resource: "clusters",
}, name)
}

func ListClusters(ctx context.Context) (result []uiv1.Cluster, _ error) {
return listClusters(ctx, "")
if len(clusterList) == 0 {
ctx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
return listClusters(ctx)
}
return clusterList, nil
}

func startPolling(ctx context.Context) {
for {
clusters, err := listClusters(ctx)
if err == nil {
clusterList = clusters
}
select {
case <-ctx.Done():
return
case <-time.After(5 * time.Second):
}
}
}

func listClusters(ctx context.Context, name string) (result []uiv1.Cluster, _ error) {
func listClusters(ctx context.Context) (result []uiv1.Cluster, _ error) {
var (
resultLock sync.Mutex
contextName = os.Getenv("CONTEXT")
)

configs, err := clusters(os.Getenv("KUBECONFIG"), name)
configs, err := clusters(os.Getenv("KUBECONFIG"))
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -125,11 +159,20 @@ func toCluster(ctx context.Context, config ClusterConfig) uiv1.Cluster {
}

if !result.Status.Available {
_, err := k8s.Discovery().ServerVersion()
if err != nil && result.Status.Error == "" {
result.Status.Error = err.Error()
} else if err == nil {
result.Status.Available = true
version := make(chan error, 1)
go func() {
_, err := k8s.Discovery().ServerVersion()
version <- err
}()
select {
case <-ctx.Done():
result.Status.Error = fmt.Sprint(ctx.Err())
case err := <-version:
if err != nil && result.Status.Error == "" {
result.Status.Error = err.Error()
} else if err == nil {
result.Status.Available = true
}
}
}

Expand All @@ -138,6 +181,19 @@ func toCluster(ctx context.Context, config ClusterConfig) uiv1.Cluster {
if err == nil {
result.Status.Provider = provider
}

nses, err := k8s.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
if err == nil {
for _, ns := range nses.Items {
if ns.Labels[labels.AcornManaged] == "true" ||
strings.HasSuffix(ns.Name, "-system") ||
ignoreNamespace[ns.Name] {
continue
}
result.Status.Namespaces = append(result.Status.Namespaces, ns.Name)
}
sort.Strings(result.Status.Namespaces)
}
}

return result
Expand Down
6 changes: 2 additions & 4 deletions pkg/ui/server/resources/cluster/cluster_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,14 @@ func toClusterConfig(rawConfig clientcmdapi.Config, contextName string, context
return cluster
}

func clusters(kubeconfig, name string) (result []ClusterConfig, _ error) {
func clusters(kubeconfig string) (result []ClusterConfig, _ error) {
rawConfig, err := rawConfig(kubeconfig)
if err != nil {
return nil, err
}

for k, v := range rawConfig.Contexts {
if name == "" || k == name || (name == "_" && rawConfig.CurrentContext == k) {
result = append(result, toClusterConfig(rawConfig, k, v))
}
result = append(result, toClusterConfig(rawConfig, k, v))
}

return
Expand Down
5 changes: 4 additions & 1 deletion pkg/ui/server/resources/cluster/cluster_store.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cluster

import (
"context"
"net/http"
"time"

Expand All @@ -10,11 +11,13 @@ import (
wranglerschemas "github.com/rancher/wrangler/pkg/schemas"
)

func Register(schemas *types.APISchemas) {
func Register(ctx context.Context, schemas *types.APISchemas) {
if _, err := schemas.Import(&uiv1.Install{}); err != nil {
panic(err)
}

go startPolling(ctx)

schemas.MustImportAndCustomize(&uiv1.Cluster{}, func(schema *types.APISchema) {
schema.Store = &ClusterStore{}
schema.ActionHandlers = map[string]http.Handler{
Expand Down
Loading

0 comments on commit 6ef8ce8

Please sign in to comment.