Skip to content

Commit 1ba2e43

Browse files
committed
refactor: kubedeployer to use gridclient interface
1 parent b125c7f commit 1ba2e43

8 files changed

Lines changed: 197 additions & 99 deletions

File tree

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,40 @@
11
package kubedeployer
22

33
import (
4-
"fmt"
4+
"kubecloud/internal/infrastructure/gridclient"
55

6-
"github.com/threefoldtech/tfgrid-sdk-go/grid-client/deployer"
7-
"go.opentelemetry.io/otel/trace"
6+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
87
)
98

109
type Client struct {
11-
GridClient deployer.TFPluginClient
12-
mnemonic string
10+
GridClient gridclient.GridClient
1311
}
1412

15-
func NewClient(mnemonic, gridNet string, debug bool, tp trace.TracerProvider) (*Client, error) {
16-
pluginOpts := []deployer.PluginOpt{
17-
deployer.WithNetwork(gridNet),
18-
deployer.WithDisableSentry(),
13+
// NewClient creates a new Client instance
14+
func NewClient(mnemonic, gridNet string, debug bool, tp *sdktrace.TracerProvider) (*Client, error) {
15+
var opts []gridclient.ClientOpts
16+
if gridNet != "" {
17+
opts = append(opts, gridclient.WithNetwork(gridNet))
1918
}
2019
if debug {
21-
pluginOpts = append(pluginOpts, deployer.WithLogs())
20+
opts = append(opts, gridclient.WithDebug())
2221
}
23-
2422
if tp != nil {
25-
pluginOpts = append(pluginOpts, deployer.WithTraceProvider(tp))
23+
opts = append(opts, gridclient.WithTracerProvider(tp))
2624
}
25+
opts = append(opts, gridclient.WithDisableSentry())
2726

28-
tfplugin, err := deployer.NewTFPluginClient(
29-
mnemonic,
30-
pluginOpts...,
31-
)
27+
gridCl, err := gridclient.NewGridClient(mnemonic, opts...)
3228
if err != nil {
33-
return nil, fmt.Errorf("failed to create TFPluginClient: %v", err)
29+
return nil, err
3430
}
3531

3632
return &Client{
37-
GridClient: tfplugin,
38-
mnemonic: mnemonic,
33+
GridClient: gridCl,
3934
}, nil
4035
}
4136

37+
// Close closes the underlying GridClient
4238
func (c *Client) Close() {
4339
c.GridClient.Close()
4440
}

backend/internal/deployment/kubedeployer/core.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import (
55
"fmt"
66
"slices"
77

8+
"kubecloud/internal/infrastructure/gridclient"
89
"kubecloud/internal/infrastructure/logger"
910
"kubecloud/internal/infrastructure/telemetry"
1011

11-
"github.com/threefoldtech/tfgrid-sdk-go/grid-client/deployer"
1212
"github.com/threefoldtech/tfgrid-sdk-go/grid-client/workloads"
1313
"go.opentelemetry.io/otel"
1414
"go.opentelemetry.io/otel/attribute"
@@ -24,7 +24,7 @@ func (c *Cluster) GetLeaderNode() (Node, error) {
2424
return c.Nodes[0], nil
2525
}
2626

27-
func (n *Node) AssignNodeIP(ctx context.Context, gridClient deployer.TFPluginClient, networkName string) error {
27+
func (n *Node) AssignNodeIP(ctx context.Context, gridClient gridclient.GridClient, networkName string) error {
2828
ctx, span := getTracer().Start(ctx, "Node.AssignNodeIP",
2929
trace.WithAttributes(
3030
attribute.String("node.name", n.Name),
@@ -109,8 +109,8 @@ func (c *Client) DeployNode(ctx context.Context, cluster *Cluster, node Node, ma
109109
leaderIP,
110110
cluster.Token,
111111
masterPubKey,
112-
c.mnemonic,
113-
c.GridClient.Network,
112+
c.GridClient.GetMnemonic(),
113+
c.GridClient.GetGridNetwork(),
114114
)
115115
if err != nil {
116116
telemetry.RecordError(span, err)
@@ -128,7 +128,7 @@ func (c *Client) DeployNode(ctx context.Context, cluster *Cluster, node Node, ma
128128
Str("deployment_name", depl.Name).
129129
Msg("Deploying to grid")
130130

131-
if err := c.GridClient.DeploymentDeployer.Deploy(ctx, &depl); err != nil {
131+
if err := c.GridClient.Deploy(ctx, &depl); err != nil {
132132
log.Error().
133133
Err(err).
134134
Str("node_name", node.Name).
@@ -144,7 +144,7 @@ func (c *Client) DeployNode(ctx context.Context, cluster *Cluster, node Node, ma
144144
Uint32("node_id", node.NodeID).
145145
Msg("Loading deployment result from grid")
146146

147-
result, err := c.GridClient.State.LoadDeploymentFromGrid(ctx, node.NodeID, node.Name)
147+
result, err := c.GridClient.LoadDeploymentFromGrid(ctx, node.NodeID, node.Name)
148148
if err != nil {
149149
telemetry.RecordError(span, err)
150150
return fmt.Errorf("failed to load deployment for node %s: %v", node.Name, err)
@@ -241,8 +241,8 @@ func (c *Client) BatchDeployNodes(ctx context.Context, cluster *Cluster, nodes [
241241
leaderIP,
242242
cluster.Token,
243243
masterPubKey,
244-
c.mnemonic,
245-
c.GridClient.Network,
244+
c.GridClient.GetMnemonic(),
245+
c.GridClient.GetGridNetwork(),
246246
)
247247
if err != nil {
248248
telemetry.RecordError(span, err)
@@ -259,7 +259,7 @@ func (c *Client) BatchDeployNodes(ctx context.Context, cluster *Cluster, nodes [
259259
log.Debug().
260260
Int("deployment_count", len(deployments)).
261261
Msg("Starting batch deployment to grid")
262-
batchErr := c.GridClient.DeploymentDeployer.BatchDeploy(ctx, deployments)
262+
batchErr := c.GridClient.BatchDeploy(ctx, deployments)
263263

264264
var successCount int
265265
var failedNodes []string
@@ -278,7 +278,7 @@ func (c *Client) BatchDeployNodes(ctx context.Context, cluster *Cluster, nodes [
278278
),
279279
)
280280

281-
result, err := c.GridClient.State.LoadDeploymentFromGrid(ctx, node.NodeID, node.Name)
281+
result, err := c.GridClient.LoadDeploymentFromGrid(ctx, node.NodeID, node.Name)
282282
if err != nil {
283283
log.Warn().Err(err).Str("node_name", node.Name).Msg("Failed to load deployment for node")
284284
failedNodes = append(failedNodes, node.Name)
@@ -418,7 +418,7 @@ func (c *Client) DeployNetwork(ctx context.Context, cluster *Cluster) error {
418418
Msg("Deploying network")
419419

420420
span.AddEvent("Deploying network")
421-
err = c.GridClient.NetworkDeployer.Deploy(ctx, &net)
421+
err = c.GridClient.DeployNetwork(ctx, &net)
422422
cluster.Network = net
423423
if err != nil {
424424
telemetry.RecordError(span, err)

backend/internal/deployment/kubedeployer/netutil.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import (
55
"fmt"
66
"net"
77

8+
"kubecloud/internal/infrastructure/gridclient"
9+
810
"github.com/pkg/errors"
9-
"github.com/threefoldtech/tfgrid-sdk-go/grid-client/deployer"
1011
"github.com/threefoldtech/tfgrid-sdk-go/grid-client/workloads"
1112
"github.com/threefoldtech/tfgrid-sdk-go/grid-client/zos"
1213
)
1314

14-
func getIpForVm(ctx context.Context, tfPluginClient deployer.TFPluginClient, networkName string, nodeID uint32) (string, error) {
15-
network := tfPluginClient.State.Networks.GetNetwork(networkName)
16-
ipRange := network.GetNodeSubnet(nodeID)
15+
func getIpForVm(ctx context.Context, tfPluginClient gridclient.GridClient, networkName string, nodeID uint32) (string, error) {
16+
ipRange := tfPluginClient.GetNodeSubnet(networkName, nodeID)
1717

1818
ip, ipRangeCIDR, err := net.ParseCIDR(ipRange)
1919
if err != nil {
@@ -46,8 +46,8 @@ func getIpForVm(ctx context.Context, tfPluginClient deployer.TFPluginClient, net
4646
return "", fmt.Errorf("all IPs are exhausted for network %s on node %d", networkName, nodeID)
4747
}
4848

49-
func getUsedHostIDsFromGrid(ctx context.Context, tfPluginClient deployer.TFPluginClient, nodeID uint32, networkName string, ipRangeCIDR *net.IPNet) ([]byte, error) {
50-
nodeClient, err := tfPluginClient.NcPool.GetNodeClient(tfPluginClient.SubstrateConn, nodeID)
49+
func getUsedHostIDsFromGrid(ctx context.Context, tfPluginClient gridclient.GridClient, nodeID uint32, networkName string, ipRangeCIDR *net.IPNet) ([]byte, error) {
50+
nodeClient, err := tfPluginClient.GetNodeClient(nodeID)
5151
if err != nil {
5252
return nil, errors.Wrapf(err, "could not get node client for node %d", nodeID)
5353
}

backend/internal/deployment/kubedeployer/noderemove.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (c *Client) isContractActive(ctx context.Context, contractID uint64) bool {
127127

128128
log := logger.ForOperation("kubedeployer", "check_contract_active")
129129
log.Debug().Uint64("contract_id", contractID).Msg("Checking if contract is active")
130-
_, err := c.GridClient.SubstrateConn.GetContract(contractID)
130+
_, err := c.GridClient.GetContract(contractID)
131131
isActive := err == nil
132132

133133
span.SetAttributes(attribute.Bool("contract.is_active", isActive))

backend/internal/deployment/statemanager/client_manager.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/xmonader/ewf"
1111
"go.opentelemetry.io/otel"
12+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
1213
"go.opentelemetry.io/otel/trace/noop"
1314
)
1415

@@ -65,8 +66,14 @@ func GetKubeClient(state ewf.State, config ClientConfig) (*kubedeployer.Client,
6566
log.Warn().Msg("Tracer provider is no-op, tracing will not work")
6667
}
6768

69+
// Extract SDK trace provider if available
70+
var tp *sdktrace.TracerProvider
71+
if globalTp != nil {
72+
tp, _ = globalTp.(*sdktrace.TracerProvider)
73+
}
74+
6875
// Create new client
69-
kubeClient, err := kubedeployer.NewClient(config.Mnemonic, config.Network, config.Debug, globalTp)
76+
kubeClient, err := kubedeployer.NewClient(config.Mnemonic, config.Network, config.Debug, tp)
7077
if err != nil {
7178
return nil, fmt.Errorf("failed to create kubeclient: %w", err)
7279
}
Lines changed: 17 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,42 @@
11
package statemanager
22

33
import (
4-
"encoding/json"
5-
"fmt"
6-
74
"kubecloud/internal/deployment/kubedeployer"
85

9-
"kubecloud/internal/infrastructure/logger"
10-
11-
"github.com/threefoldtech/tfgrid-sdk-go/grid-client/state"
126
"github.com/xmonader/ewf"
137
)
148

15-
// GridClientState represents the critical state that needs to be preserved
16-
type GridClientState struct {
17-
CurrentNodeDeployments map[uint32][]uint64 `json:"current_node_deployments"`
18-
NetworkSubnets map[string]map[uint32]string `json:"network_subnets"`
19-
}
9+
const gridClientStateKey = "gridclient_state"
2010

21-
// SaveGridClientState saves the critical GridClient state to workflow state
11+
// SaveGridClientState saves the GridClient state to the workflow state
2212
func SaveGridClientState(workflowState ewf.State, kubeClient *kubedeployer.Client) {
23-
log := logger.ForOperation("statemanager", "save_gridclient_state")
24-
if kubeClient == nil || kubeClient.GridClient.State == nil {
13+
if kubeClient == nil || kubeClient.GridClient == nil {
2514
return
2615
}
2716

28-
gridState := GridClientState{
29-
CurrentNodeDeployments: make(map[uint32][]uint64),
30-
NetworkSubnets: make(map[string]map[uint32]string),
31-
}
32-
33-
// Save CurrentNodeDeployments
34-
for nodeID, contractIDs := range kubeClient.GridClient.State.CurrentNodeDeployments {
35-
gridState.CurrentNodeDeployments[nodeID] = []uint64(contractIDs)
36-
}
37-
38-
// Save network subnet information
39-
for networkName, network := range kubeClient.GridClient.State.Networks.State {
40-
gridState.NetworkSubnets[networkName] = network.Subnets
17+
stateData, err := kubeClient.GridClient.GetState()
18+
if err != nil {
19+
return
4120
}
4221

43-
// Store as JSON string in workflow state
44-
if stateBytes, err := json.Marshal(gridState); err == nil {
45-
workflowState["gridclient_state"] = string(stateBytes)
46-
log.Debug().Msg("Saved GridClient state to workflow state")
47-
} else {
48-
log.Warn().Err(err).Msg("Failed to marshal GridClient state")
49-
}
22+
workflowState[gridClientStateKey] = stateData
5023
}
5124

52-
// RestoreGridClientState restores the critical GridClient state from workflow state
25+
// RestoreGridClientState restores the GridClient state from the workflow state
5326
func RestoreGridClientState(workflowState ewf.State, kubeClient *kubedeployer.Client) error {
54-
log := logger.ForOperation("statemanager", "restore_gridclient_state")
55-
if kubeClient == nil || kubeClient.GridClient.State == nil {
56-
return fmt.Errorf("invalid kubeclient or gridclient state")
57-
}
58-
59-
stateStr, ok := workflowState["gridclient_state"].(string)
60-
if !ok || stateStr == "" {
61-
log.Debug().Msg("No GridClient state found in workflow state")
62-
return nil // Not an error, just no state to restore
63-
}
64-
65-
var savedState GridClientState
66-
if err := json.Unmarshal([]byte(stateStr), &savedState); err != nil {
67-
return fmt.Errorf("failed to unmarshal GridClient state: %w", err)
27+
if kubeClient == nil || kubeClient.GridClient == nil {
28+
return nil
6829
}
6930

70-
// Restore CurrentNodeDeployments
71-
kubeClient.GridClient.State.CurrentNodeDeployments = make(map[uint32]state.ContractIDs)
72-
for nodeID, contractIDs := range savedState.CurrentNodeDeployments {
73-
kubeClient.GridClient.State.CurrentNodeDeployments[nodeID] = state.ContractIDs(contractIDs)
31+
stateData, ok := workflowState[gridClientStateKey]
32+
if !ok {
33+
return nil
7434
}
7535

76-
// Restore network subnet information
77-
kubeClient.GridClient.State.Networks.State = make(map[string]state.Network)
78-
for networkName, subnets := range savedState.NetworkSubnets {
79-
kubeClient.GridClient.State.Networks.State[networkName] = state.Network{
80-
Subnets: subnets,
81-
}
36+
stateBytes, ok := stateData.([]byte)
37+
if !ok {
38+
return nil
8239
}
8340

84-
log.Debug().Msg("Restored GridClient state from workflow state")
85-
return nil
41+
return kubeClient.GridClient.RestoreState(stateBytes)
8642
}

0 commit comments

Comments
 (0)