Skip to content

Commit 346e4ed

Browse files
author
Vadim Lazovsky
committed
Introduced the capability to change the list of monitors in the existing Ceph PV
1 parent 99aa901 commit 346e4ed

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

2020/04-etcdhelper/README.md

+5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ go build -o etcdhelper etcdhelper.go
4949
./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-pod-cidr 10.55.0.0/16
5050
```
5151

52+
### Change Ceph PV monitors list
53+
```shell
54+
./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-monitors-list pvc-d748b019-52be-4c0c-a928-44503ccd94ac 10.0.1.1:6789,10.0.1.2:6789,10.0.1.3:6789
55+
```
56+
5257
# Status
5358

5459
This enhanced version of etcdhelper is **PoC (proof of concept)**. Use it on your own risk.

2020/04-etcdhelper/etcdhelper.go

+47
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"fmt"
1010
"os"
1111
"regexp"
12+
"strings"
1213
"time"
1314

1415
"go.etcd.io/etcd/clientv3"
@@ -58,6 +59,21 @@ func main() {
5859
}
5960
os.Exit(1)
6061
}
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+
6177
action := flag.Arg(0)
6278
key := ""
6379
if flag.NArg() > 1 {
@@ -100,6 +116,8 @@ func main() {
100116
err = changeServiceCIDR(client, flag.Arg(1))
101117
case "change-pod-cidr":
102118
err = changePodCIDR(client, flag.Arg(1))
119+
case "change-monitors-list":
120+
err = changeMonitorsList(client, flag.Arg(1), flag.Arg(2))
103121
case "dump":
104122
err = dump(client)
105123
default:
@@ -194,6 +212,35 @@ func changePodCIDR(client *clientv3.Client, cidr string) error {
194212
return nil
195213
}
196214

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+
197244
func listKeys(client *clientv3.Client, key string) ([]string, error) {
198245
var resp *clientv3.GetResponse
199246
var err error

2020/04-etcdhelper/go.mod

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module etcdhelper
2+
3+
go 1.14
4+
5+
require (
6+
github.com/coreos/etcd v3.3.20+incompatible // indirect
7+
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect
8+
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
9+
github.com/gardener/machine-controller-manager v0.29.0
10+
go.etcd.io/etcd v3.3.20+incompatible
11+
go.uber.org/zap v1.15.0 // indirect
12+
k8s.io/api v0.17.2
13+
k8s.io/apimachinery v0.17.2
14+
k8s.io/kubectl v0.17.2
15+
)

0 commit comments

Comments
 (0)