|
9 | 9 | "fmt"
|
10 | 10 | "os"
|
11 | 11 | "regexp"
|
| 12 | + "strings" |
12 | 13 | "time"
|
13 | 14 |
|
14 | 15 | "go.etcd.io/etcd/clientv3"
|
@@ -58,6 +59,21 @@ func main() {
|
58 | 59 | }
|
59 | 60 | os.Exit(1)
|
60 | 61 | }
|
| 62 | + if flag.Arg(0) == "change-monitors-list" { |
| 63 | + if flag.Arg(1) == "" || flag.Arg(2) == "" { |
| 64 | + fmt.Fprint(os.Stderr, "ERROR: you have to specify both: PV name and list of comma-separated monitor IP-addresses\n") |
| 65 | + os.Exit(1) |
| 66 | + } |
| 67 | + if !regexp.MustCompile(`^pvc-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$`).MatchString(flag.Arg(1)) { |
| 68 | + fmt.Fprint(os.Stderr, "ERROR: invalid PV name. Ex: pvc-dd3afe18-1bae-411c-9a1d-df129847cb62") |
| 69 | + os.Exit(1) |
| 70 | + } |
| 71 | + if !regexp.MustCompile(`^(((\d+\.){3}\d+):\d+,?)+$`).MatchString(flag.Arg(2)) { |
| 72 | + fmt.Fprint(os.Stderr, "ERROR: invalid IP-address list. Ex: 1.1.1.1:6789,2.2.2.2:6789,3.3.3.3:6789\n") |
| 73 | + os.Exit(1) |
| 74 | + } |
| 75 | + } |
| 76 | + |
61 | 77 | action := flag.Arg(0)
|
62 | 78 | key := ""
|
63 | 79 | if flag.NArg() > 1 {
|
@@ -100,6 +116,8 @@ func main() {
|
100 | 116 | err = changeServiceCIDR(client, flag.Arg(1))
|
101 | 117 | case "change-pod-cidr":
|
102 | 118 | err = changePodCIDR(client, flag.Arg(1))
|
| 119 | + case "change-monitors-list": |
| 120 | + err = changeMonitorsList(client, flag.Arg(1), flag.Arg(2)) |
103 | 121 | case "dump":
|
104 | 122 | err = dump(client)
|
105 | 123 | default:
|
@@ -194,6 +212,35 @@ func changePodCIDR(client *clientv3.Client, cidr string) error {
|
194 | 212 | return nil
|
195 | 213 | }
|
196 | 214 |
|
| 215 | +func changeMonitorsList(client *clientv3.Client, pvName, list string) error { |
| 216 | + decoder := scheme.Codecs.UniversalDeserializer() |
| 217 | + |
| 218 | + pvKey := fmt.Sprintf("/registry/persistentvolumes/%s", pvName) |
| 219 | + |
| 220 | + resp, err := clientv3.NewKV(client).Get(context.Background(), pvKey) |
| 221 | + if err != nil { |
| 222 | + fmt.Printf("get key %s %s\n", pvKey, err) |
| 223 | + } |
| 224 | + |
| 225 | + obj, _, _ := decoder.Decode(resp.Kvs[0].Value, nil, nil) |
| 226 | + |
| 227 | + pv := obj.(*v1.PersistentVolume) |
| 228 | + |
| 229 | + monitors := strings.Split(strings.Trim(list, ","), ",") |
| 230 | + pv.Spec.RBD.CephMonitors = monitors |
| 231 | + |
| 232 | + protoSerializer := protobuf.NewSerializer(scheme.Scheme, scheme.Scheme) |
| 233 | + newObj := new(bytes.Buffer) |
| 234 | + protoSerializer.Encode(obj, newObj) |
| 235 | + |
| 236 | + _, err = clientv3.NewKV(client).Put(context.Background(), pvKey, newObj.String()) |
| 237 | + if err != nil { |
| 238 | + fmt.Printf("put to key %s %s\n", pvKey, err) |
| 239 | + } |
| 240 | + |
| 241 | + return nil |
| 242 | +} |
| 243 | + |
197 | 244 | func listKeys(client *clientv3.Client, key string) ([]string, error) {
|
198 | 245 | var resp *clientv3.GetResponse
|
199 | 246 | var err error
|
|
0 commit comments