Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support ipv6 #1769

Merged
merged 1 commit into from Jun 20, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions PendingReleaseNotes.md
Expand Up @@ -48,3 +48,5 @@ Here are some sample commands to help with your transition.

- Legacy CRD types in the `rook.io/v1alpha1` API group have been deprecated. The types from
`rook.io/v1alpha2` should now be used instead.
- Legacy command flag `public-ipv4` in the ceph components have been deprecated, `public-ip` should now be used instead.
- Legacy command flag `private-ipv4` in the ceph components have been deprecated, `private-ip` should now be used instead.
22 changes: 19 additions & 3 deletions cmd/rook/ceph/ceph.go
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/rook/rook/pkg/daemon/ceph/mon"
osdconfig "github.com/rook/rook/pkg/operator/ceph/cluster/osd/config"
"github.com/rook/rook/pkg/util/exec"
"github.com/rook/rook/pkg/util/flags"
)

var Cmd = &cobra.Command{
Expand Down Expand Up @@ -73,18 +74,33 @@ func createContext() *clusterd.Context {
ConfigDir: cfg.dataDir,
ConfigFileOverride: cfg.cephConfigOverride,
LogLevel: rook.Cfg.LogLevel,
NetworkInfo: cfg.networkInfo,
NetworkInfo: cfg.networkInfo.Simplify(),
}
}

func addCephFlags(command *cobra.Command) {
command.Flags().StringVar(&cfg.networkInfo.PublicAddrIPv4, "public-ipv4", "127.0.0.1", "public IPv4 address for this machine")
command.Flags().StringVar(&cfg.networkInfo.ClusterAddrIPv4, "private-ipv4", "127.0.0.1", "private IPv4 address for this machine")
command.Flags().StringVar(&cfg.networkInfo.PublicAddr, "public-ip", "127.0.0.1", "public IP address for this machine")
command.Flags().StringVar(&cfg.networkInfo.ClusterAddr, "private-ip", "127.0.0.1", "private IP address for this machine")
command.Flags().StringVar(&clusterInfo.Name, "cluster-name", "rookcluster", "ceph cluster name")
command.Flags().StringVar(&clusterInfo.FSID, "fsid", "", "the cluster uuid")
command.Flags().StringVar(&clusterInfo.MonitorSecret, "mon-secret", "", "the cephx keyring for monitors")
command.Flags().StringVar(&clusterInfo.AdminSecret, "admin-secret", "", "secret for the admin user (random if not specified)")
command.Flags().StringVar(&cfg.monEndpoints, "mon-endpoints", "", "ceph mon endpoints")
command.Flags().StringVar(&cfg.dataDir, "config-dir", "/var/lib/rook", "directory for storing configuration")
command.Flags().StringVar(&cfg.cephConfigOverride, "ceph-config-override", "", "optional path to a ceph config file that will be appended to the config files that rook generates")

// deprecated ipv4 format address
// TODO: remove these legacy flags in the future
command.Flags().StringVar(&cfg.networkInfo.PublicAddrIPv4, "public-ipv4", "127.0.0.1", "public IPv4 address for this machine")
command.Flags().StringVar(&cfg.networkInfo.ClusterAddrIPv4, "private-ipv4", "127.0.0.1", "private IPv4 address for this machine")
command.Flags().MarkDeprecated("public-ipv4", "Use --public-ip instead. Will be removed in a future version.")
command.Flags().MarkDeprecated("private-ipv4", "Use --private-ip instead. Will be removed in a future version.")
}

func verifyRenamedFlags(cmd *cobra.Command) error {
renamed := []flags.RenamedFlag{
{NewFlagName: "public-ip", OldFlagName: "public-ipv4"},
{NewFlagName: "private-ip", OldFlagName: "private-ipv4"},
}
return flags.VerifyRenamedFlags(cmd, renamed)
}
6 changes: 5 additions & 1 deletion cmd/rook/ceph/mds.go
Expand Up @@ -49,11 +49,15 @@ func init() {
}

func startMDS(cmd *cobra.Command, args []string) error {
required := []string{"mon-endpoints", "cluster-name", "admin-secret", "filesystem-id", "pod-name", "public-ipv4", "private-ipv4"}
required := []string{"mon-endpoints", "cluster-name", "admin-secret", "filesystem-id", "pod-name"}
if err := flags.VerifyRequiredFlags(mdsCmd, required); err != nil {
return err
}

if err := verifyRenamedFlags(mdsCmd); err != nil {
return err
}

rook.SetLogLevel()

rook.LogStartupInfo(mdsCmd.Flags())
Expand Down
6 changes: 5 additions & 1 deletion cmd/rook/ceph/mgr.go
Expand Up @@ -45,11 +45,15 @@ func init() {
}

func startMgr(cmd *cobra.Command, args []string) error {
required := []string{"mon-endpoints", "cluster-name", "mon-secret", "admin-secret", "public-ipv4", "private-ipv4"}
required := []string{"mon-endpoints", "cluster-name", "mon-secret", "admin-secret"}
if err := flags.VerifyRequiredFlags(mgrCmd, required); err != nil {
return err
}

if err := verifyRenamedFlags(mgrCmd); err != nil {
return err
}

rook.SetLogLevel()

rook.LogStartupInfo(mgrCmd.Flags())
Expand Down
8 changes: 6 additions & 2 deletions cmd/rook/ceph/mon.go
Expand Up @@ -49,11 +49,15 @@ func init() {
}

func startMon(cmd *cobra.Command, args []string) error {
required := []string{"name", "fsid", "mon-secret", "admin-secret", "config-dir", "cluster-name", "public-ipv4", "private-ipv4"}
required := []string{"name", "fsid", "mon-secret", "admin-secret", "config-dir", "cluster-name"}
if err := flags.VerifyRequiredFlags(monCmd, required); err != nil {
return err
}

if err := verifyRenamedFlags(monCmd); err != nil {
return err
}

rook.SetLogLevel()

rook.LogStartupInfo(monCmd.Flags())
Expand All @@ -68,7 +72,7 @@ func startMon(cmd *cobra.Command, args []string) error {

// at first start the local monitor needs to be added to the list of mons
clusterInfo.Monitors = mon.ParseMonEndpoints(cfg.monEndpoints)
clusterInfo.Monitors[monName] = mon.ToCephMon(monName, cfg.networkInfo.PublicAddrIPv4, monPort)
clusterInfo.Monitors[monName] = mon.ToCephMon(monName, cfg.networkInfo.PublicAddr, monPort)

monCfg := &mon.Config{
Name: monName,
Expand Down
6 changes: 5 additions & 1 deletion cmd/rook/ceph/osd.go
Expand Up @@ -69,11 +69,15 @@ func init() {
}

func startOSD(cmd *cobra.Command, args []string) error {
required := []string{"cluster-name", "cluster-id", "mon-endpoints", "mon-secret", "admin-secret", "node-name", "public-ipv4", "private-ipv4"}
required := []string{"cluster-name", "cluster-id", "mon-endpoints", "mon-secret", "admin-secret", "node-name"}
if err := flags.VerifyRequiredFlags(osdCmd, required); err != nil {
return err
}

if err := verifyRenamedFlags(osdCmd); err != nil {
return err
}

var dataDevices string
var usingDeviceFilter bool
if osdDataDeviceFilter != "" {
Expand Down
6 changes: 5 additions & 1 deletion cmd/rook/ceph/rgw.go
Expand Up @@ -56,11 +56,15 @@ func init() {
}

func startRGW(cmd *cobra.Command, args []string) error {
required := []string{"mon-endpoints", "cluster-name", "rgw-name", "rgw-keyring", "public-ipv4", "private-ipv4"}
required := []string{"mon-endpoints", "cluster-name", "rgw-name", "rgw-keyring"}
if err := flags.VerifyRequiredFlags(rgwCmd, required); err != nil {
return err
}

if err := verifyRenamedFlags(rgwCmd); err != nil {
return err
}

if rgwPort == 0 && rgwSecurePort == 0 {
return fmt.Errorf("port or secure port are required")
}
Expand Down
34 changes: 30 additions & 4 deletions pkg/clusterd/network.go
Expand Up @@ -21,18 +21,44 @@ import (
)

type NetworkInfo struct {
PublicAddr string
ClusterAddr string
PublicNetwork string // public network and subnet mask in CIDR notation
ClusterNetwork string // cluster network and subnet mask in CIDR notation

// deprecated ipv4 format address
// TODO: remove these legacy fields in the future
PublicAddrIPv4 string
ClusterAddrIPv4 string
PublicNetwork string // public network and subnet mask in CIDR notation
ClusterNetwork string // cluster network and subnet mask in CIDR notation
}

// Simplify adapts deprecated fields
// TODO: remove this function in the future
func (in NetworkInfo) Simplify() (out NetworkInfo) {
out = NetworkInfo{
PublicNetwork: in.PublicNetwork,
ClusterNetwork: in.ClusterNetwork,
}
if in.PublicAddr != "" {
out.PublicAddr = in.PublicAddr
} else {
out.PublicAddr = in.PublicAddrIPv4
}

if in.ClusterAddr != "" {
out.ClusterAddr = in.ClusterAddr
} else {
out.ClusterAddr = in.ClusterAddrIPv4
}
return out
}

func VerifyNetworkInfo(networkInfo NetworkInfo) error {
if err := verifyIPAddr(networkInfo.PublicAddrIPv4); err != nil {
if err := verifyIPAddr(networkInfo.PublicAddr); err != nil {
return err
}

if err := verifyIPAddr(networkInfo.ClusterAddrIPv4); err != nil {
if err := verifyIPAddr(networkInfo.ClusterAddr); err != nil {
return err
}

Expand Down
55 changes: 43 additions & 12 deletions pkg/clusterd/network_test.go
Expand Up @@ -26,31 +26,62 @@ func TestVerifyNetworkInfo(t *testing.T) {

// well formed network info is OK
networkInfo = NetworkInfo{
PublicAddrIPv4: "10.1.1.1",
PublicNetwork: "10.1.1.0/24",
ClusterAddrIPv4: "10.1.2.2",
ClusterNetwork: "10.1.2.0/24",
PublicAddr: "10.1.1.1",
PublicNetwork: "10.1.1.0/24",
ClusterAddr: "10.1.2.2",
ClusterNetwork: "10.1.2.0/24",
}
err = VerifyNetworkInfo(networkInfo)
assert.Nil(t, err)

// malformed IP address is not OK
networkInfo = NetworkInfo{
PublicAddrIPv4: "10.1.1.256",
PublicNetwork: "10.1.1.0/24",
ClusterAddrIPv4: "10.1.2.256",
ClusterNetwork: "10.1.2.0/24",
PublicAddr: "10.1.1.256",
PublicNetwork: "10.1.1.0/24",
ClusterAddr: "10.1.2.256",
ClusterNetwork: "10.1.2.0/24",
}
err = VerifyNetworkInfo(networkInfo)
assert.NotNil(t, err)

// malformed network address is not OK
networkInfo = NetworkInfo{
PublicAddrIPv4: "10.1.1.1",
PublicNetwork: "10.1.1.0/33",
ClusterAddrIPv4: "10.1.2.2",
ClusterNetwork: "10.1.2.0/33",
PublicAddr: "10.1.1.1",
PublicNetwork: "10.1.1.0/33",
ClusterAddr: "10.1.2.2",
ClusterNetwork: "10.1.2.0/33",
}
err = VerifyNetworkInfo(networkInfo)
assert.NotNil(t, err)
}

func TestNetworkInfoSimplify(t *testing.T) {

out := NetworkInfo{
PublicAddr: "10.1.1.1",
PublicNetwork: "10.1.1.0/24",
ClusterAddr: "10.1.2.2",
ClusterNetwork: "10.1.2.0/24",
}

// only has old fields
in := NetworkInfo{
PublicAddrIPv4: "10.1.1.1",
PublicNetwork: "10.1.1.0/24",
ClusterAddrIPv4: "10.1.2.2",
ClusterNetwork: "10.1.2.0/24",
}
assert.Equal(t, out, in.Simplify())

// has both new and old fields
in = NetworkInfo{
PublicAddr: "10.1.1.1",
PublicAddrIPv4: "10.9.1.1",
PublicNetwork: "10.1.1.0/24",
ClusterAddr: "10.1.2.2",
ClusterAddrIPv4: "10.9.2.2",
ClusterNetwork: "10.1.2.0/24",
}
assert.Equal(t, out, in.Simplify())

}
4 changes: 2 additions & 2 deletions pkg/daemon/ceph/mon/config.go
Expand Up @@ -294,9 +294,9 @@ func CreateDefaultCephConfig(context *clusterd.Context, cluster *ClusterInfo, ru
MonHost: strings.Join(monHosts, ","),
LogFile: "/dev/stdout",
MonClusterLogFile: "/dev/stdout",
PublicAddr: context.NetworkInfo.PublicAddrIPv4,
PublicAddr: context.NetworkInfo.PublicAddr,
PublicNetwork: context.NetworkInfo.PublicNetwork,
ClusterAddr: context.NetworkInfo.ClusterAddrIPv4,
ClusterAddr: context.NetworkInfo.ClusterAddr,
ClusterNetwork: context.NetworkInfo.ClusterNetwork,
MonKeyValueDb: "rocksdb",
MonAllowPoolDelete: true,
Expand Down
8 changes: 4 additions & 4 deletions pkg/daemon/ceph/mon/config_test.go
Expand Up @@ -46,10 +46,10 @@ func TestCreateDefaultCephConfig(t *testing.T) {
context := &clusterd.Context{
LogLevel: capnslog.INFO,
NetworkInfo: clusterd.NetworkInfo{
PublicAddrIPv4: "10.1.1.1",
PublicNetwork: "10.1.1.0/24",
ClusterAddrIPv4: "10.1.2.2",
ClusterNetwork: "10.1.2.0/24",
PublicAddr: "10.1.1.1",
PublicNetwork: "10.1.1.0/24",
ClusterAddr: "10.1.2.2",
ClusterNetwork: "10.1.2.0/24",
},
}

Expand Down
11 changes: 8 additions & 3 deletions pkg/daemon/ceph/mon/daemon.go
Expand Up @@ -17,6 +17,7 @@ package mon

import (
"fmt"
"net"
"os"
"strings"

Expand Down Expand Up @@ -63,7 +64,7 @@ func ParseMonEndpoints(input string) map[string]*CephMonitorConfig {
}

func ToCephMon(name, ip string, port int32) *CephMonitorConfig {
return &CephMonitorConfig{Name: name, Endpoint: fmt.Sprintf("%s:%d", ip, port)}
return &CephMonitorConfig{Name: name, Endpoint: joinHostPort(ip, port)}
}

func Run(context *clusterd.Context, config *Config) error {
Expand Down Expand Up @@ -148,12 +149,16 @@ func startMon(context *clusterd.Context, config *Config, confFilePath, monDataDi
fmt.Sprintf("--mon-data=%s", monDataDir),
fmt.Sprintf("--conf=%s", confFilePath),
fmt.Sprintf("--keyring=%s", keyringPath),
fmt.Sprintf("--public-addr=%s:%d", context.NetworkInfo.PublicAddrIPv4, config.Port),
fmt.Sprintf("--public-bind-addr=%s:%d", context.NetworkInfo.ClusterAddrIPv4, config.Port),
fmt.Sprintf("--public-addr=%s", joinHostPort(context.NetworkInfo.PublicAddr, config.Port)),
fmt.Sprintf("--public-bind-addr=%s", joinHostPort(context.NetworkInfo.ClusterAddr, config.Port)),
}
if err = context.Executor.ExecuteCommand(false, config.Name, "ceph-mon", args...); err != nil {
return fmt.Errorf("failed to start mon: %+v", err)
}

return nil
}

func joinHostPort(host string, port int32) string {
return net.JoinHostPort(host, fmt.Sprintf("%d", port))
}
4 changes: 2 additions & 2 deletions pkg/operator/k8sutil/pod.go
Expand Up @@ -36,9 +36,9 @@ const (
// ClusterAttr cluster label
ClusterAttr = "rook_cluster"
// PublicIPEnvVar public IP env var
PublicIPEnvVar = "ROOK_PUBLIC_IPV4"
PublicIPEnvVar = "ROOK_PUBLIC_IP"
// PrivateIPEnvVar pod IP env var
PrivateIPEnvVar = "ROOK_PRIVATE_IPV4"
PrivateIPEnvVar = "ROOK_PRIVATE_IP"

// DefaultRepoPrefix repo prefix
DefaultRepoPrefix = "rook"
Expand Down
20 changes: 20 additions & 0 deletions pkg/util/flags/flags.go
Expand Up @@ -37,6 +37,26 @@ func VerifyRequiredFlags(cmd *cobra.Command, requiredFlags []string) error {
return createRequiredFlagError(cmd.Name(), missingFlags)
}

type RenamedFlag struct {
NewFlagName string
OldFlagName string
}

func VerifyRenamedFlags(cmd *cobra.Command, renamedFlags []RenamedFlag) error {
var missingFlags []string
for _, renamedFlag := range renamedFlags {
val, err := cmd.Flags().GetString(renamedFlag.NewFlagName)
if err != nil || val == "" {
val, err := cmd.Flags().GetString(renamedFlag.OldFlagName)
if err != nil || val == "" {
missingFlags = append(missingFlags, renamedFlag.NewFlagName)
}
}
}

return createRequiredFlagError(cmd.Name(), missingFlags)
}

func VerifyRequiredUint64Flags(cmd *cobra.Command, requiredFlags []string) error {
var missingFlags []string
for _, reqFlag := range requiredFlags {
Expand Down