diff --git a/cli/cmd/prompt.go b/cli/cmd/prompt.go index 27d6ba966a1ef06a0e32986c228bfdf1a8439c4d..0047f9087bcb46cbdc51bbe8a6abddb94e36b107 100644 --- a/cli/cmd/prompt.go +++ b/cli/cmd/prompt.go @@ -47,7 +47,7 @@ import ( // PromptCompleter provides completion for a device type PromptCompleter struct { - //NOTE: not too sure about this but for now it should be sufficient + //NOTE: should be removed deviceID uuid.UUID yangSchemaCompleterMap map[uuid.UUID]*completer.YangSchemaCompleter } @@ -113,7 +113,7 @@ func (pc *PromptCompleter) cstmCompleter(d prompt.Document) []prompt.Suggest { currCmd = c } - return completionBasedOnCmd(pc, currCmd, inputSplit, inputFlags, d) + return completionBasedOnCmd(pc, currCmd, inputSplitFiltered, inputFlags, d) } func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string) { @@ -128,51 +128,54 @@ func filterFlagSlice(input []string) (commandSlice []string, flagSlice []string) } func deviceGetCompletion(c *PromptCompleter, d prompt.Document, inputSplit []string) []prompt.Suggest { - inputLen := len(inputSplit) - if inputLen == 2 || inputLen == 3 { - if id, err := uuid.Parse(inputSplit[inputLen-1]); err == nil { - if c, ok := c.yangSchemaCompleterMap[id]; ok { - return c.Complete(d) - } - dev, err := pndAdapter.GetDevice(id.String()) - if err != nil { - return []prompt.Suggest{} - } - sid, err := uuid.Parse(dev[0].GetSbi().GetId()) - if err != nil { - return []prompt.Suggest{} - } - schemaTree, err := pndAdapter.GetSbiSchemaTree(sid) - if err != nil { - return []prompt.Suggest{} - } - c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true) - if yc, ok := c.yangSchemaCompleterMap[id]; ok { - c.deviceID = id - return yc.Complete(d) - } - + switch inputLen := len(inputSplit); inputLen { + case 2: + return devicePrompt(d) + case 3: + id, err := uuid.Parse(inputSplit[inputLen-1]) + if err != nil { + return devicePrompt(d) + } + if c, ok := c.yangSchemaCompleterMap[id]; ok { + return c.Complete(d) + } + schemaTree, err := getSchemaTreeForDeviceID(id.String()) + if err != nil { + return []prompt.Suggest{} + } + c.yangSchemaCompleterMap[id] = completer.NewYangSchemaCompleter(schemaTree["Device"], true) + if yc, ok := c.yangSchemaCompleterMap[id]; ok { + c.deviceID = id + return yc.Complete(d) + } + case 4: + if d.GetWordBeforeCursor() == "" || d.GetWordAfterCursor() != "" { return []prompt.Suggest{} } - if inputLen == 2 || (inputLen == 3 && !(d.GetWordBeforeCursor() == "")) { - spinner, _ := pterm.DefaultSpinner.Start("Requesting devices from controller.") - devices, err := getDevices() - if err != nil { - spinner.Fail(err) - return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true) - } - spinner.Success() - return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true) + _, err := uuid.Parse(inputSplit[inputLen-2]) + if err != nil { + return devicePrompt(d) } - } else { if yc, ok := c.yangSchemaCompleterMap[c.deviceID]; ok { return yc.Complete(d) } + default: return []prompt.Suggest{} } return []prompt.Suggest{} } +func devicePrompt(d prompt.Document) []prompt.Suggest { + spinner, _ := pterm.DefaultSpinner.Start("Requesting devices from controller.") + devices, err := getDevices() + if err != nil { + spinner.Fail(err) + return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true) + } + spinner.Success() + return prompt.FilterHasPrefix(devices, d.GetWordBeforeCursor(), true) +} + func cobraCommandCompletion(currCmd *cobra.Command, d prompt.Document, inputFlags []string, loaded []prompt.Suggest) []prompt.Suggest { if currCmd.HasAvailableFlags() { currCmd.LocalFlags().VisitAll( diff --git a/cli/cmd/utils.go b/cli/cmd/utils.go index 0b341581550116ea47eb4287fcbca43ba5f337c1..8c2813a140caa397c2828998cea25cc4f377072b 100644 --- a/cli/cmd/utils.go +++ b/cli/cmd/utils.go @@ -39,6 +39,8 @@ import ( "code.fbi.h-da.de/danet/gosdn/cli/completer" "code.fbi.h-da.de/danet/gosdn/controller/api" "github.com/c-bata/go-prompt" + "github.com/google/uuid" + "github.com/openconfig/goyang/pkg/yang" "github.com/spf13/viper" ) @@ -69,6 +71,18 @@ func getDevices() ([]prompt.Suggest, error) { return completer.SortSuggestionByText(s), nil } +func getSchemaTreeForDeviceID(id string) (map[string]*yang.Entry, error) { + dev, err := pndAdapter.GetDevice(id) + if err != nil { + return nil, err + } + sid, err := uuid.Parse(dev[0].GetSbi().GetId()) + if err != nil { + return nil, err + } + return pndAdapter.GetSbiSchemaTree(sid) +} + func getPnds() []prompt.Suggest { resp, err := api.GetIds(viper.GetString("controllerAPIEndpoint")) if err != nil {