github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/daemon/cluster/convert/node.go (about) 1 package convert // import "github.com/Prakhar-Agarwal-byte/moby/daemon/cluster/convert" 2 3 import ( 4 "fmt" 5 "strings" 6 7 types "github.com/Prakhar-Agarwal-byte/moby/api/types/swarm" 8 gogotypes "github.com/gogo/protobuf/types" 9 swarmapi "github.com/moby/swarmkit/v2/api" 10 ) 11 12 // NodeFromGRPC converts a grpc Node to a Node. 13 func NodeFromGRPC(n swarmapi.Node) types.Node { 14 node := types.Node{ 15 ID: n.ID, 16 Spec: types.NodeSpec{ 17 Role: types.NodeRole(strings.ToLower(n.Spec.DesiredRole.String())), 18 Availability: types.NodeAvailability(strings.ToLower(n.Spec.Availability.String())), 19 }, 20 Status: types.NodeStatus{ 21 State: types.NodeState(strings.ToLower(n.Status.State.String())), 22 Message: n.Status.Message, 23 Addr: n.Status.Addr, 24 }, 25 } 26 27 // Meta 28 node.Version.Index = n.Meta.Version.Index 29 node.CreatedAt, _ = gogotypes.TimestampFromProto(n.Meta.CreatedAt) 30 node.UpdatedAt, _ = gogotypes.TimestampFromProto(n.Meta.UpdatedAt) 31 32 // Annotations 33 node.Spec.Annotations = annotationsFromGRPC(n.Spec.Annotations) 34 35 // Description 36 if n.Description != nil { 37 node.Description.Hostname = n.Description.Hostname 38 if n.Description.Platform != nil { 39 node.Description.Platform.Architecture = n.Description.Platform.Architecture 40 node.Description.Platform.OS = n.Description.Platform.OS 41 } 42 if n.Description.Resources != nil { 43 node.Description.Resources.NanoCPUs = n.Description.Resources.NanoCPUs 44 node.Description.Resources.MemoryBytes = n.Description.Resources.MemoryBytes 45 node.Description.Resources.GenericResources = GenericResourcesFromGRPC(n.Description.Resources.Generic) 46 } 47 if n.Description.Engine != nil { 48 node.Description.Engine.EngineVersion = n.Description.Engine.EngineVersion 49 node.Description.Engine.Labels = n.Description.Engine.Labels 50 for _, plugin := range n.Description.Engine.Plugins { 51 node.Description.Engine.Plugins = append(node.Description.Engine.Plugins, types.PluginDescription{Type: plugin.Type, Name: plugin.Name}) 52 } 53 } 54 if n.Description.TLSInfo != nil { 55 node.Description.TLSInfo.TrustRoot = string(n.Description.TLSInfo.TrustRoot) 56 node.Description.TLSInfo.CertIssuerPublicKey = n.Description.TLSInfo.CertIssuerPublicKey 57 node.Description.TLSInfo.CertIssuerSubject = n.Description.TLSInfo.CertIssuerSubject 58 } 59 for _, csi := range n.Description.CSIInfo { 60 if csi != nil { 61 convertedInfo := types.NodeCSIInfo{ 62 PluginName: csi.PluginName, 63 NodeID: csi.NodeID, 64 MaxVolumesPerNode: csi.MaxVolumesPerNode, 65 } 66 67 if csi.AccessibleTopology != nil { 68 convertedInfo.AccessibleTopology = &types.Topology{ 69 Segments: csi.AccessibleTopology.Segments, 70 } 71 } 72 73 node.Description.CSIInfo = append( 74 node.Description.CSIInfo, convertedInfo, 75 ) 76 } 77 } 78 } 79 80 // Manager 81 if n.ManagerStatus != nil { 82 node.ManagerStatus = &types.ManagerStatus{ 83 Leader: n.ManagerStatus.Leader, 84 Reachability: types.Reachability(strings.ToLower(n.ManagerStatus.Reachability.String())), 85 Addr: n.ManagerStatus.Addr, 86 } 87 } 88 89 return node 90 } 91 92 // NodeSpecToGRPC converts a NodeSpec to a grpc NodeSpec. 93 func NodeSpecToGRPC(s types.NodeSpec) (swarmapi.NodeSpec, error) { 94 spec := swarmapi.NodeSpec{ 95 Annotations: swarmapi.Annotations{ 96 Name: s.Name, 97 Labels: s.Labels, 98 }, 99 } 100 if role, ok := swarmapi.NodeRole_value[strings.ToUpper(string(s.Role))]; ok { 101 spec.DesiredRole = swarmapi.NodeRole(role) 102 } else { 103 return swarmapi.NodeSpec{}, fmt.Errorf("invalid Role: %q", s.Role) 104 } 105 106 if availability, ok := swarmapi.NodeSpec_Availability_value[strings.ToUpper(string(s.Availability))]; ok { 107 spec.Availability = swarmapi.NodeSpec_Availability(availability) 108 } else { 109 return swarmapi.NodeSpec{}, fmt.Errorf("invalid Availability: %q", s.Availability) 110 } 111 112 return spec, nil 113 }