From a1ee960ec93a923be72362381cc99ed845abc6ca Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Mon, 28 Aug 2023 15:44:45 +0100 Subject: [PATCH] pkg/ceph: [WIP] Signed-off-by: Alejandro Mery --- go.mod | 1 + go.sum | 2 ++ pkg/ceph/ceph.go | 2 ++ pkg/ceph/config.go | 46 +++++++++++++++++++++++++++++++++ pkg/ceph/config_parser.go | 54 +++++++++++++++++++++++++++++++++++++++ pkg/zones/ceph.go | 30 ++++++++++++++++++++++ pkg/zones/scan.go | 16 ++++++++++++ 7 files changed, 151 insertions(+) create mode 100644 pkg/ceph/ceph.go create mode 100644 pkg/ceph/config.go create mode 100644 pkg/ceph/config_parser.go create mode 100644 pkg/zones/ceph.go diff --git a/go.mod b/go.mod index 32a761d..2d9495e 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( darvaza.org/sidecar v0.0.0-20230721122716-b9c54b8adbaf darvaza.org/slog v0.5.2 github.com/burntSushi/toml v0.3.1 + github.com/gofrs/uuid/v5 v5.0.0 github.com/hack-pad/hackpadfs v0.2.1 github.com/mgechev/revive v1.3.3 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index 2ba5e41..bfde6a6 100644 --- a/go.sum +++ b/go.sum @@ -26,6 +26,8 @@ github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBD github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/hack-pad/hackpadfs v0.2.1 h1:FelFhIhv26gyjujoA/yeFO+6YGlqzmc9la/6iKMIxMw= github.com/hack-pad/hackpadfs v0.2.1/go.mod h1:khQBuCEwGXWakkmq8ZiFUvUZz84ZkJ2KNwKvChs4OrU= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= diff --git a/pkg/ceph/ceph.go b/pkg/ceph/ceph.go new file mode 100644 index 0000000..53e1099 --- /dev/null +++ b/pkg/ceph/ceph.go @@ -0,0 +1,2 @@ +// Package ceph deals with ceph config +package ceph diff --git a/pkg/ceph/config.go b/pkg/ceph/config.go new file mode 100644 index 0000000..7cf73e8 --- /dev/null +++ b/pkg/ceph/config.go @@ -0,0 +1,46 @@ +package ceph + +import ( + "bytes" + "io" + "net/netip" + + "github.com/gofrs/uuid/v5" + + "asciigoat.org/ini/basic" +) + +// Config represents a ceph.conf file +type Config struct { + Global GlobalConfig `ini:"global"` +} + +// WriteTo writes a Wireguard [Config] onto the provided [io.Writer] +func (*Config) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + + return buf.WriteTo(w) +} + +// GlobalConfig represents the [global] section of a ceph.conf file +type GlobalConfig struct { + FSID uuid.UUID `ini:"fsid"` + Monitors []string `ini:"mon_host,comma"` + MonitorsAddr []netip.Addr `ini:"mon_initial_members,comma"` + ClusterNetwork netip.Prefix `ini:"cluster_network"` +} + +// NewConfigFromReader parses the ceph.conf file +func NewConfigFromReader(r io.Reader) (*Config, error) { + doc, err := basic.Decode(r) + if err != nil { + return nil, err + } + + cfg, err := newConfigFromDocument(doc) + if err != nil { + return nil, err + } + + return cfg, nil +} diff --git a/pkg/ceph/config_parser.go b/pkg/ceph/config_parser.go new file mode 100644 index 0000000..a0b3383 --- /dev/null +++ b/pkg/ceph/config_parser.go @@ -0,0 +1,54 @@ +package ceph + +import ( + "io/fs" + "log" + + "asciigoat.org/ini/basic" + "darvaza.org/core" +) + +func loadConfSection(out *Config, src *basic.Section) error { + switch src.Key { + case "global": + return loadGlobalConfSection(out, src) + default: + return core.Wrapf(fs.ErrInvalid, "unknown section %q", src.Key) + } +} + +func loadGlobalConfSection(out *Config, src *basic.Section) error { + var cfg GlobalConfig + + for _, field := range src.Fields { + if err := loadGlobalConfField(&cfg, field); err != nil { + return core.Wrap(err, "global") + } + } + + out.Global = cfg + return nil +} + +func loadGlobalConfField(_ *GlobalConfig, field basic.Field) error { + log.Printf("%s[%q] = %q", "global", field.Key, field.Value) + return nil +} + +func newConfigFromDocument(doc *basic.Document) (*Config, error) { + var out Config + + if len(doc.Global) > 0 { + err := core.Wrap(fs.ErrInvalid, "fields before the first section") + return nil, err + } + + for i := range doc.Sections { + src := &doc.Sections[i] + if err := loadConfSection(&out, src); err != nil { + return nil, err + } + } + + return &out, nil +} diff --git a/pkg/zones/ceph.go b/pkg/zones/ceph.go new file mode 100644 index 0000000..550827b --- /dev/null +++ b/pkg/zones/ceph.go @@ -0,0 +1,30 @@ +package zones + +import ( + "bytes" + + "git.jpi.io/amery/jpictl/pkg/ceph" +) + +// GetCephConfig reads the ceph.conf file +func (m *Zones) GetCephConfig() (*ceph.Config, error) { + data, err := m.ReadFile("ceph.conf") + if err != nil { + return nil, err + } + + r := bytes.NewReader(data) + return ceph.NewConfigFromReader(r) +} + +// WriteCephConfig writes the ceph.conf file +func (m *Zones) WriteCephConfig(cfg *ceph.Config) error { + f, err := m.CreateTruncFile("ceph.conf") + if err != nil { + return err + } + defer f.Close() + + _, err = cfg.WriteTo(f) + return err +} diff --git a/pkg/zones/scan.go b/pkg/zones/scan.go index 08734a3..15a4f0d 100644 --- a/pkg/zones/scan.go +++ b/pkg/zones/scan.go @@ -2,6 +2,8 @@ package zones import ( "io/fs" + "log" + "os" "sort" ) @@ -12,6 +14,7 @@ func (m *Zones) scan(opts *ScanOptions) error { m.scanZoneIDs, m.scanSort, m.scanGateways, + m.scanCephMonitors, } { if err := fn(opts); err != nil { return err @@ -121,6 +124,19 @@ func (m *Zones) scanGateways(_ *ScanOptions) error { return err } +func (m *Zones) scanCephMonitors(_ *ScanOptions) error { + cfg, err := m.GetCephConfig() + switch { + case os.IsNotExist(err): + err = nil + case err != nil: + return err + } + + log.Print(cfg) + return nil +} + func (z *Zone) scan() error { // each directory is a machine entries, err := fs.ReadDir(z.zones.dir, z.Name)