blob: 9a894ccd9b1012ad9185ee1f0305d553d5240d6c [file] [log] [blame]
/*
* Copyright 2021-present Ciena Corporation
*
* 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 commands
import (
"fmt"
"os"
flags "github.com/jessevdk/go-flags"
configv3 "github.com/opencord/voltctl/internal/pkg/apis/config/v3"
"github.com/opencord/voltctl/pkg/format"
yaml "gopkg.in/yaml.v2"
)
const (
DefaultOutputFormat = "table{{.Current}}\t{{.Name}}\t{{.Server}}\t{{.KvStore}}\t{{.Kafka}}"
)
type StackUse struct {
Args struct {
Name string `positional-arg-name:"NAME" required:"yes"`
} `positional-args:"yes"`
}
type StackAdd struct {
Args struct {
Name string `positional-arg-name:"NAME" required:"yes"`
} `positional-args:"yes"`
}
type StackDelete struct {
Args struct {
Name string `positional-arg-name:"NAME" required:"yes"`
} `positional-args:"yes"`
}
type StackList struct {
ListOutputOptions
}
type StackOptions struct {
List StackList `command:"list" description:"list all configured stacks"`
Add StackAdd `command:"add" description:"add or update the named stack using command line options"`
Delete StackDelete `command:"delete" description:"delete the specified stack configuration"`
Use StackUse `command:"use" description:"perist the specified stack to be used by default"`
}
func RegisterStackCommands(parent *flags.Parser) {
if _, err := parent.AddCommand("stack", "generate voltctl configuration", "Commands to generate voltctl configuration", &StackOptions{}); err != nil {
Error.Fatalf("Unexpected error while attempting to register config commands : %s", err)
}
}
type StackInfo struct {
Current string `json:"current"`
Name string `json:"name"`
Server string `json:"server"`
Kafka string `json:"kafka"`
KvStore string `json:"kvstore"`
}
func write() error {
w, err := os.OpenFile(GlobalOptions.Config, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
defer w.Close()
encode := yaml.NewEncoder(w)
if err := encode.Encode(GlobalConfig); err != nil {
return err
}
return nil
}
func (options *StackList) Execute(args []string) error {
ReadConfig()
ApplyOptionOverrides(nil)
var data []StackInfo
for _, stack := range GlobalConfig.Stacks {
s := StackInfo{
Name: stack.Name,
Server: stack.Server,
Kafka: stack.Kafka,
KvStore: stack.KvStore,
}
if stack.Name == GlobalConfig.CurrentStack {
s.Current = "*"
}
data = append(data, s)
}
outputFormat := CharReplacer.Replace(options.Format)
if outputFormat == "" {
outputFormat = GetCommandOptionWithDefault("stack-list", "format",
DefaultOutputFormat)
}
if options.Quiet {
outputFormat = "{{.Name}}"
}
orderBy := options.OrderBy
if orderBy == "" {
orderBy = GetCommandOptionWithDefault("stack-list", "order", "")
}
result := CommandResult{
Format: format.Format(outputFormat),
Filter: options.Filter,
OrderBy: orderBy,
OutputAs: toOutputType(options.OutputAs),
NameLimit: options.NameLimit,
Data: data,
}
GenerateOutput(&result)
return nil
}
func (options *StackUse) Execute(args []string) error {
ReadConfig()
for _, stack := range GlobalConfig.Stacks {
if stack.Name == options.Args.Name {
GlobalConfig.CurrentStack = stack.Name
ApplyOptionOverrides(stack)
if err := write(); err != nil {
Error.Fatal(err.Error())
}
fmt.Printf("wrote: '%s'\n", GlobalOptions.Config)
return nil
}
}
Error.Fatalf("unknown stack: '%s'", options.Args.Name)
return nil
}
func (options *StackDelete) Execute(args []string) error {
ReadConfig()
ApplyOptionOverrides(nil)
for i, stack := range GlobalConfig.Stacks {
if stack.Name == options.Args.Name {
GlobalConfig.Stacks = append(GlobalConfig.Stacks[:i], GlobalConfig.Stacks[i+1:]...)
if GlobalConfig.CurrentStack == stack.Name {
GlobalConfig.CurrentStack = ""
}
if err := write(); err != nil {
Error.Fatal(err.Error())
}
fmt.Printf("wrote: '%s'\n", GlobalOptions.Config)
return nil
}
}
Error.Fatalf("stack not found, '%s'", options.Args.Name)
return nil
}
func (options *StackAdd) Execute(args []string) error {
ReadConfig()
stack := GlobalConfig.StackByName(options.Args.Name)
if stack == nil {
stack = configv3.NewDefaultStack(options.Args.Name)
GlobalConfig.Stacks = append(GlobalConfig.Stacks, stack)
}
if GlobalConfig.CurrentStack == "" {
GlobalConfig.CurrentStack = options.Args.Name
}
ApplyOptionOverrides(stack)
if err := write(); err != nil {
Error.Fatal(err.Error())
}
return nil
}