airshipui/DevelopersGuide.md
Jordan Jensen e384d17be6 Use endpoint to show Argo UI
- A proxy or port forward should not be necessary to show the Argo UI
  instead the endpoint should be used to eliminate user steps
- Remove proxy instructions in Developers Guide
- Remove nested pages. Only one page is necessary - the Argo UI
- Update Octant to latest version on master
- Remove TestRouteHandles as a service.Request cannot be created that
  can be used by getArgoUIURL. The functions are not exported

Change-Id: I2a69d3804474f21baafa5e0388eefd569d9ca1a2
2020-01-23 08:04:59 -08:00

157 lines
9.0 KiB
Markdown
Executable File

# Octant Airship UI Plugin Developer's Guide
## Step by step installation of the Airship UI
1. This installation requires a working kubernetes or minikube (single node) installation including the kubectl command.
2. Install [Go](https://golang.org/dl/) v1.13 or newer
3. Install [Octant](https://github.com/vmware-tanzu/octant)
4. Install [Argo CLI](https://github.com/argoproj/argo/blob/master/docs/getting-started.md)
5. Install [Argo UI](https://github.com/argoproj/argo/blob/master/README.md)
6. Clone the AirshipUI repository and build the Airship UI plugin
```
git clone https://opendev.org/airship/airshipui
cd airshipui
make build install-plugins
```
Example output:
```
$ make build install-plugins
go build -o bin/airshipui -ldflags='-X opendev.org/airship/airshipui/internal/environment.version=7274339' cmd/airshipui/main.go
go build -o bin/argoui -ldflags='-X opendev.org/airship/airshipui/internal/environment.version=7274339' cmd/argoui/main.go
cp bin/argoui ~/.config/octant/plugins
```
7. Start Airship UI with the airship/bin/airshipui command
```
$ bin/airshipui
2020-01-09T13:52:14.260-0800 INFO module/manager.go:79 registering action {"component": "module-manager", "actionPath": "deployment/configuration", "module-name": "overview"}
2020-01-09T13:52:14.261-0800 INFO module/manager.go:79 registering action {"component": "module-manager", "actionPath": "overview/containerEditor", "module-name": "overview"}
2020-01-09T13:52:14.261-0800 INFO module/manager.go:79 registering action {"component": "module-manager", "actionPath": "overview/serviceEditor", "module-name": "overview"}
2020-01-09T13:52:14.261-0800 INFO module/manager.go:79 registering action {"component": "module-manager", "actionPath": "octant/deleteObject", "module-name": "configuration"}
2020-01-09T13:52:14.282-0800 INFO plugin/manager.go:397 registered plugin "argoui" {"plugin-name": "argoui", "cmd": "/home/gary/.config/octant/plugins/argoui", "metadata": {"Name":"argoui","Description":"Argo UI version 7274339","Capabilities":{"IsModule":true}}}
2020-01-09T13:52:14.282-0800 INFO plugin/manager.go:405 plugin supports navigation {"plugin-name": "argoui"}
2020-01-09T13:52:14.308-0800 INFO plugin/manager.go:397 registered plugin "plugin-name" {"plugin-name": "octant-sample-plugin", "cmd": "/home/gary/.config/octant/plugins/octant-sample-plugin", "metadata": {"Name":"plugin-name","Description":"a description","Capabilities":{"SupportsPrinterConfig":[{"Group":"","Version":"v1","Kind":"Pod"}],"SupportsTab":[{"Group":"","Version":"v1","Kind":"Pod"}],"IsModule":true}}}
2020-01-09T13:52:14.308-0800 INFO plugin/manager.go:405 plugin supports navigation {"plugin-name": "octant-sample-plugin"}
2020-01-09T13:52:14.309-0800 INFO dash/dash.go:381 Using embedded Octant frontend
2020-01-09T13:52:14.315-0800 INFO dash/dash.go:360 Dashboard is available at http://127.0.0.1:7777
```
8. If you're unable to open a browser on the machine running the Airship UI you can tunnel the connection over ssh and use a browser on your local machine
```
ssh -L 7777:localhost:7777 -L 8001:localhost:8001 <id>@<remote_host>
```
9. The Argo UI should be available at http://127.0.0.1:7777/#/argo-ui
## Working with the Airship UI
Airship UI utilizes the Octant plugin to drive some of the functionality. Octant has a [plugin sample](https://github.com/vmware-tanzu/octant/blob/master/cmd/octant-sample-plugin/main.go) which is the basis of these instructions.
### Write a hello world plugin of your very own
1. Clone the Airship UI repository (if not already done previously)
```
git clone https://opendev.org/airship/airshipui
```
2. cd airshipui
3. Make a hello-world package under the cmd sub folder to contain your code
```
mkdir cmd/hello-world
```
4. Create / edit main.go under the cmd/hello-world directory. This is modeled off the [Octant sample plugin](https://github.com/vmware-tanzu/octant/blob/master/cmd/octant-sample-plugin/main.go)
```
package main
import (
"log"
"github.com/vmware-tanzu/octant/pkg/navigation"
"github.com/vmware-tanzu/octant/pkg/plugin"
"github.com/vmware-tanzu/octant/pkg/plugin/service"
"github.com/vmware-tanzu/octant/pkg/view/component"
)
var pluginName = "hello-world"
// This is a sample plugin showing the features of Octant's plugin API.
func main() {
// Remove the prefix from the go logger since Octant will print logs with timestamps.
log.SetPrefix("")
// Tell Octant to call this plugin when printing configuration or tabs for Pods
capabilities := &plugin.Capabilities{
IsModule: true,
}
// Set up what should happen when Octant calls this plugin.
options := []service.PluginOption{
service.WithNavigation(handleNavigation, initRoutes),
}
// Use the plugin service helper to register this plugin.
p, err := service.Register(pluginName, "The very smallest thing you can do", capabilities, options...)
if err != nil {
log.Fatal(err)
}
// The plugin can log and the log messages will show up in Octant.
log.Printf("hello-world-plugin is starting")
p.Serve()
}
// handleNavigation controls what is displayed on the navigation pane
func handleNavigation(request *service.NavigationRequest) (navigation.Navigation, error) {
return navigation.Navigation{
Title: "Hello World Plugin",
Path: request.GeneratePath(),
IconName: "folder",
}, nil
}
// initRoutes routes for this plugin. In this example, there is a global catch all route
// that will return the content for every single path.
func initRoutes(router *service.Router) {
router.HandleFunc("*", func(request *service.Request) (component.ContentResponse, error) {
contentResponse := component.NewContentResponse(component.TitleFromString("Hello World Title"))
helloWorld := component.NewText("Hello World just some text on the page")
contentResponse.Add(helloWorld)
// NOTE: this will print out messages only if the -v is added to the start of octent or airship
log.Printf("Sample debugging message: %v\n", helloWorld)
return *contentResponse, nil
})
}
```
5. Build the hello-world plugin
Build the single plugin
```
go build -o ~/.config/octant/plugins/hello-world-plugin cmd/hello-world/main.go
```
Or build all by issuing a make command. Example output:
```
$ make
go build -o bin/airshipui -ldflags='-X opendev.org/airship/airshipui/internal/environment.version=7274339' cmd/airshipui/main.go
go build -o bin/hello-world -ldflags='-X opendev.org/airship/airshipui/internal/environment.version=7274339' cmd/hello-world/main.go
go build -o bin/argoui -ldflags='-X opendev.org/airship/airshipui/internal/environment.version=7274339' cmd/argoui/main.go
```
6. Restart the airshipgui with the -v flag so you can see the debug output (~/airshipui/bin/airshipui -v). Open your browser to http://127.0.0.1:7777/#/configuration/plugins to make sure the hello-world plugin showed up.
You will see example of the debug message added to the initRoutes function in the log:
```
2020-01-15T19:00:11.530Z DEBUG hello-world-plugin plugin/logger.go:33 2020/01/15 19:00:11 Sample debugging message: Hello World just some text on the page
```
7. You should be able to explore the basic plugin functionality by clicking on it in the navigation pane.
8. You can add other components for fun from the [Octant documentation](https://octant.dev/docs/master/plugins/reference/#component-text) for further enhancement to the page
## Appendix
### Minikube
[Minikube](https://kubernetes.io/docs/setup/learning-environment/minikube/) runs a single-node Kubernetes cluster for users looking to try out Kubernetes or develop with it day-to-day. Installation instructions are available on the kubernetes website: https://kubernetes.io/docs/tasks/tools/install-minikube/). If you are running behind a proxy it may be necessary to follow the steps outlined in the [How to use an HTTP/HTTPS proxy with minikube](https://minikube.sigs.k8s.io/docs/reference/networking/proxy/) website.
### Optional proxy settings
#### Environment settings for wget or curl
If your network has a proxy that prevents successful curls or wgets you may need to set the proxy environment variables. The local ip is included in the no_proxy setting to prevent any local running process that may attempt api calls against it from being sent through the proxy for the request:
```
export http_proxy=<proxy_host>:<proxy_port>
export HTTP_PROXY=<proxy_host>:<proxy_port>
export https_proxy=<proxy_host>:<proxy_port>
export HTTPS_PROXY=<proxy_host>:<proxy_port>
export no_proxy=localhost,127.0.0.1,<LOCAL_IP>
export NO_PROXY=localhost,127.0.0.1,<LOCAL_IP>
```