package intention import ( "fmt" "strings" "github.com/hashicorp/consul/api" ) // ParseIntentionTarget parses a target of the form // and returns // the distinct parts. In some cases the partition and namespace may be elided and this function // will return the empty string for them then. // If two parts are present, it is assumed they are namespace/name and not partition/name. func ParseIntentionTarget(input string) (name string, ns string, partition string, err error) { ss := strings.Split(input, "/") switch len(ss) { case 1: // Name only name = ss[0] return case 2: // namespace/name ns = ss[0] name = ss[1] return case 3: // partition/namespace/name partition = ss[0] ns = ss[1] name = ss[2] return default: return "", "", "", fmt.Errorf("input can contain at most two '/'") } } func GetFromArgs(client *api.Client, args []string) (*api.Intention, error) { switch len(args) { case 1: id := args[0] //nolint:staticcheck ixn, _, err := client.Connect().IntentionGet(id, nil) if err != nil { return nil, fmt.Errorf("Error reading the intention: %s", err) } else if ixn == nil { return nil, fmt.Errorf("Intention not found with ID %q", id) } return ixn, nil case 2: source, destination := args[0], args[1] ixn, _, err := client.Connect().IntentionGetExact(source, destination, nil) if err != nil { return nil, fmt.Errorf("Error reading the intention: %s", err) } else if ixn == nil { return nil, fmt.Errorf("Intention not found with source %q and destination %q", source, destination) } return ixn, nil default: return nil, fmt.Errorf("command requires exactly 1 or 2 arguments") } }