2016-07-25 6 views
1

Кто-нибудь знает, как конкатенировать строки из консула для консул-шаблона?Как объединить метаданные службы для консула-шаблона с запятыми

Если у меня есть сервис «Foo» зарегистрирован в консулом

{ 
    "Node": "node1", 
    "Address": "192.168.0.1", 
    "Port": 3333 
}, 
{ 
    "Node": "node2", 
    "Address": "192.168.0.2", 
    "Port": 4444 
} 

Я хотел бы консулом-шаблон для генерации следующую строку:

servers=192.168.0.1:3333,192.168.0.2:4444/bogus 

Следующая попытка не работает, так как он оставляет замыкающая запятая ,

servers={{range service "foo"}}{{.Address}}{{.Port}},{{end}}/bogus 
# renders 
servers=192.168.0.1:3333,192.168.0.2:4444,/bogus 

# What I actually want 
servers=192.168.0.1:3333,192.168.0.2:4444/bogus 

Я знаю, консул-шаблон использует г синтаксис шаблона olang, но я просто не могу понять синтаксис, чтобы заставить это работать. Вероятно, я должен использовать код консула-шаблона join, но как мне пройти как .Address, так и .Port до join? Это всего лишь тривиальный пример, и я не использую индексы намеренно, так как число служб может быть больше двух. Есть идеи?

ответ

0

Вы можете использовать собственный плагин.

servers={{service "foo" | toJSON | plugin "path/to/plugin"}} 

Код плагина:

package main 

import (
    "encoding/json" 
    "fmt" 
    "os" 
) 

type InputEntry struct { 
    Node string 
    Address string 
    Port int 
} 

func main() { 
    arg := []byte(os.Args[1]) 
    var input []InputEntry 
    if err := json.Unmarshal(arg, &input); err != nil { 
     fmt.Fprintln(os.Stderr, fmt.Sprintf("err: %s", err)) 
     os.Exit(1) 
    } 

    var output string 
    for i, entry := range input { 
     output += fmt.Sprintf("%v:%v", entry.Address, entry.Port) 
     if i != len(input)-1 { 
      output += "," 
     } 
    } 

    fmt.Fprintln(os.Stdout, string(output)) 
    os.Exit(0) 
} 
1

Это должно работать.

{{$foo_srv := service "foo"}} 
{{if $foo_srv}} 
    {{$last := len $foo_srv | subtract 1}} 
servers= 
    {{- range $i := loop $last}} 
    {{- with index $foo_srv $i}}{{.Address}}{{.Port}},{{end}} 
    {{- end}} 
    {{- with index $foo_srv last}}{{.Address}}{{.Port}}{{end}}/bogus 
{{end}} 

Я думал, если можно использовать "join".

Примечание: «{{-" означает удаление ведущих пробелов (таких как ', \ t, \ n).