-
Notifications
You must be signed in to change notification settings - Fork 184
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add server implementation for peerblockpool rpc call
Signed-off-by: Rewant Soni <[email protected]>
- Loading branch information
1 parent
ea05750
commit 42c6b87
Showing
5 changed files
with
262 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
package server | ||
|
||
import ( | ||
"context" | ||
"crypto/md5" | ||
"encoding/hex" | ||
"encoding/json" | ||
"fmt" | ||
"slices" | ||
|
||
rookCephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" | ||
|
||
corev1 "k8s.io/api/core/v1" | ||
kerrors "k8s.io/apimachinery/pkg/api/errors" | ||
"k8s.io/apimachinery/pkg/types" | ||
ctrl "sigs.k8s.io/controller-runtime" | ||
"sigs.k8s.io/controller-runtime/pkg/client" | ||
) | ||
|
||
type cephBlockPoolManager struct { | ||
client client.Client | ||
namespace string | ||
} | ||
|
||
func newCephBlockPoolManager(cl client.Client, namespace string) (*cephBlockPoolManager, error) { | ||
return &cephBlockPoolManager{ | ||
client: cl, | ||
namespace: namespace, | ||
}, nil | ||
} | ||
|
||
func (c *cephBlockPoolManager) EnableBlockPoolMirroring(ctx context.Context, blockPoolName string) error { | ||
|
||
cephBlockPool := &rookCephv1.CephBlockPool{} | ||
cephBlockPool.Name = blockPoolName | ||
cephBlockPool.Namespace = c.namespace | ||
|
||
_, err := ctrl.CreateOrUpdate(ctx, c.client, cephBlockPool, func() error { | ||
cephBlockPool.Spec.Mirroring.Enabled = true | ||
cephBlockPool.Spec.Mirroring.Mode = "image" | ||
return nil | ||
}) | ||
if err != nil { | ||
return fmt.Errorf("failed to enable mirroring on CephBlockPool resource with name %q. %v", blockPoolName, err) | ||
} | ||
|
||
return nil | ||
|
||
} | ||
|
||
func (c *cephBlockPoolManager) SetBootstrapSecretRef(ctx context.Context, blockPoolName string, secretData map[string][]byte) error { | ||
|
||
cephBlockPool, err := c.GetBlockPoolByName(ctx, blockPoolName) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
// create the secret | ||
secretJSON, err := json.Marshal(secretData) | ||
if err != nil { | ||
return err | ||
} | ||
secretNameMd5Sum := md5.Sum(secretJSON) | ||
secretName := hex.EncodeToString(secretNameMd5Sum[:16]) | ||
|
||
bootstrapSecret := &corev1.Secret{} | ||
bootstrapSecret.Name = secretName | ||
bootstrapSecret.Namespace = c.namespace | ||
|
||
_, err = ctrl.CreateOrUpdate(ctx, c.client, bootstrapSecret, func() error { | ||
bootstrapSecret.Data = secretData | ||
err := ctrl.SetControllerReference(cephBlockPool, bootstrapSecret, c.client.Scheme()) | ||
if err != nil { | ||
return err | ||
} | ||
return nil | ||
}) | ||
if err != nil { | ||
return fmt.Errorf("failed to create/update the bootstrap secret %q. %v", secretName, err) | ||
} | ||
|
||
_, err = ctrl.CreateOrUpdate(ctx, c.client, cephBlockPool, func() error { | ||
if cephBlockPool.Spec.Mirroring.Peers == nil { | ||
cephBlockPool.Spec.Mirroring.Peers = &rookCephv1.MirroringPeerSpec{SecretNames: []string{secretName}} | ||
} else { | ||
index := slices.IndexFunc(cephBlockPool.Spec.Mirroring.Peers.SecretNames, func(s string) bool { | ||
return s == secretName | ||
}) | ||
if index < 0 { | ||
cephBlockPool.Spec.Mirroring.Peers.SecretNames = append(cephBlockPool.Spec.Mirroring.Peers.SecretNames, secretName) | ||
} | ||
} | ||
return nil | ||
}) | ||
if err != nil { | ||
return fmt.Errorf("failed to set bootstrap secret ref on CephBlockPool resource with name %q. %v", blockPoolName, err) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func (c *cephBlockPoolManager) GetBlockPoolByName(ctx context.Context, blockPoolName string) (*rookCephv1.CephBlockPool, error) { | ||
blockPoolObj := &rookCephv1.CephBlockPool{} | ||
err := c.client.Get(ctx, types.NamespacedName{Name: blockPoolName, Namespace: c.namespace}, blockPoolObj) | ||
if err != nil { | ||
if kerrors.IsNotFound(err) { | ||
return nil, fmt.Errorf("CephBlockPool resource %q not found. %v", blockPoolName, err) | ||
} | ||
return nil, fmt.Errorf("failed to get CephBlockPool resource with name %q. %v", blockPoolName, err) | ||
} | ||
return blockPoolObj, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package server | ||
|
||
import ( | ||
"context" | ||
kerrors "k8s.io/apimachinery/pkg/api/errors" | ||
"k8s.io/apimachinery/pkg/types" | ||
|
||
rookCephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" | ||
|
||
"sigs.k8s.io/controller-runtime/pkg/client" | ||
) | ||
|
||
const rBDMirrorName = "rbd-mirror" | ||
|
||
type cephRBDMirrorManager struct { | ||
client client.Client | ||
namespace string | ||
} | ||
|
||
func newCephRBDMirrorManager(cl client.Client, namespace string) (*cephRBDMirrorManager, error) { | ||
return &cephRBDMirrorManager{ | ||
client: cl, | ||
namespace: namespace, | ||
}, nil | ||
} | ||
|
||
func (c *cephRBDMirrorManager) Create(ctx context.Context) error { | ||
|
||
cephRBDMirrorObj := &rookCephv1.CephRBDMirror{} | ||
err := c.client.Get(ctx, types.NamespacedName{Name: rBDMirrorName, Namespace: c.namespace}, cephRBDMirrorObj) | ||
if err == nil { | ||
return nil | ||
} | ||
|
||
if err != nil && !kerrors.IsNotFound(err) { | ||
return err | ||
} | ||
|
||
cephRBDMirrorObj.Name = rBDMirrorName | ||
cephRBDMirrorObj.Namespace = c.namespace | ||
cephRBDMirrorObj.Spec = rookCephv1.RBDMirroringSpec{Count: 1} | ||
|
||
err = c.client.Create(ctx, cephRBDMirrorObj) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters