|
| 1 | +package cmd |
| 2 | + |
| 3 | +import ( |
| 4 | + "github.com/fatih/color" |
| 5 | + "github.com/spf13/cobra" |
| 6 | + containermanger "github.com/swiftwave-org/swiftwave/container_manager" |
| 7 | + "github.com/swiftwave-org/swiftwave/swiftwave_service/core" |
| 8 | + "os" |
| 9 | + "os/exec" |
| 10 | + "path/filepath" |
| 11 | + "strconv" |
| 12 | +) |
| 13 | + |
| 14 | +func init() { |
| 15 | + udpProxyCmd.AddCommand(udpProxyStatusCmd) |
| 16 | + udpProxyCmd.AddCommand(udpProxyStartCmd) |
| 17 | + udpProxyCmd.AddCommand(udpProxyStopCmd) |
| 18 | +} |
| 19 | + |
| 20 | +var udpProxyCmd = &cobra.Command{ |
| 21 | + Use: "udpproxy", |
| 22 | + Short: "Manage UDP Proxy service", |
| 23 | + Long: "Manage UDP Proxy service", |
| 24 | +} |
| 25 | + |
| 26 | +// Start command |
| 27 | +var udpProxyStartCmd = &cobra.Command{ |
| 28 | + Use: "start", |
| 29 | + Short: "Start UDP Proxy service", |
| 30 | + Long: "Start UDP Proxy service", |
| 31 | + Run: func(cmd *cobra.Command, args []string) { |
| 32 | + // Delete socket file if it already exists |
| 33 | + if checkIfFileExists(systemConfig.UDPProxyConfig.UnixSocketPath) { |
| 34 | + err := os.Remove(systemConfig.UDPProxyConfig.UnixSocketPath) |
| 35 | + if err != nil { |
| 36 | + printError("Failed to remove socket file > " + systemConfig.UDPProxyConfig.UnixSocketPath) |
| 37 | + return |
| 38 | + } |
| 39 | + } |
| 40 | + dockerImage := systemConfig.UDPProxyConfig.DockerImage |
| 41 | + // base directory for socket file |
| 42 | + unixSocketMountDir := filepath.Dir(systemConfig.UDPProxyConfig.UnixSocketPath) |
| 43 | + // Fetch hostname |
| 44 | + hostname, err := os.Hostname() |
| 45 | + if err != nil { |
| 46 | + printError("failed to fetch hostname") |
| 47 | + return |
| 48 | + } |
| 49 | + // Find out required ports |
| 50 | + ports := []uint{} |
| 51 | + dbClient, err := getDBClient() |
| 52 | + if err == nil { |
| 53 | + var ingressRules []core.IngressRule |
| 54 | + tx := dbClient.Select("port").Where("port IS NOT NULL").Where("protocol = ?", "udp").Find(&ingressRules) |
| 55 | + if tx.Error == nil { |
| 56 | + if ingressRules != nil { |
| 57 | + for _, ingressRule := range ingressRules { |
| 58 | + ports = append(ports, ingressRule.Port) |
| 59 | + } |
| 60 | + } |
| 61 | + } |
| 62 | + } |
| 63 | + // Start HAProxy service |
| 64 | + args1 := []string{ |
| 65 | + "service", "create", |
| 66 | + "--name", systemConfig.UDPProxyConfig.ServiceName, |
| 67 | + "--mode", "replicated", |
| 68 | + "--replicas", "1", |
| 69 | + "--network", systemConfig.ServiceConfig.NetworkName, |
| 70 | + "--constraint", "node.hostname==" + hostname, |
| 71 | + "--mount", "type=bind,source=" + unixSocketMountDir + ",destination=/etc/udpproxy", |
| 72 | + "--mount", "type=bind,source=" + systemConfig.UDPProxyConfig.DataDir + ",destination=/var/lib/udpproxy", |
| 73 | + } |
| 74 | + args2 := make([]string, 0, len(ports)) |
| 75 | + for _, port := range ports { |
| 76 | + args2 = append(args2, "--publish", "mode=host,protocol=udp,target="+strconv.Itoa(int(port))+",published="+strconv.Itoa(int(port))) |
| 77 | + } |
| 78 | + args3 := []string{ |
| 79 | + "--env", "SWIFTWAVE_SERVICE_ENDPOINT=" + systemConfig.ServiceConfig.AddressOfCurrentNode + ":" + strconv.Itoa(systemConfig.ServiceConfig.BindPort), |
| 80 | + dockerImage, |
| 81 | + } |
| 82 | + finalArgs := append(append(args1, args2...), args3...) |
| 83 | + dockerCmd := exec.Command("docker", finalArgs...) |
| 84 | + dockerCmd.Stdout = os.Stdout |
| 85 | + dockerCmd.Stderr = os.Stderr |
| 86 | + dockerCmd.Stdin = os.Stdin |
| 87 | + err = dockerCmd.Run() |
| 88 | + if err != nil { |
| 89 | + printError("Failed to start UDP Proxy service") |
| 90 | + return |
| 91 | + } |
| 92 | + printSuccess("Started UDP Proxy service") |
| 93 | + }, |
| 94 | +} |
| 95 | + |
| 96 | +// Stop command |
| 97 | +var udpProxyStopCmd = &cobra.Command{ |
| 98 | + Use: "stop", |
| 99 | + Short: "Stop UDP Proxy service", |
| 100 | + Long: "Stop UDP Proxy service", |
| 101 | + Run: func(cmd *cobra.Command, args []string) { |
| 102 | + // Stop HAProxy service |
| 103 | + dockerCmd := exec.Command("docker", "service", "rm", systemConfig.UDPProxyConfig.ServiceName) |
| 104 | + err := dockerCmd.Run() |
| 105 | + if err != nil { |
| 106 | + printError("Failed to stop UDP Proxy service") |
| 107 | + return |
| 108 | + } |
| 109 | + printSuccess("Stopped UDP Proxy service") |
| 110 | + }, |
| 111 | +} |
| 112 | + |
| 113 | +// Status command |
| 114 | +var udpProxyStatusCmd = &cobra.Command{ |
| 115 | + Use: "status", |
| 116 | + Short: "Show UDP Proxy service status", |
| 117 | + Long: "Show UDP Proxy service status", |
| 118 | + Run: func(cmd *cobra.Command, args []string) { |
| 119 | + // Show HAProxy service status |
| 120 | + dockerManager, err := containermanger.NewDockerManager(systemConfig.ServiceConfig.DockerUnixSocketPath) |
| 121 | + if err != nil { |
| 122 | + printError("Failed to connect to docker daemon") |
| 123 | + return |
| 124 | + } |
| 125 | + serviceDetails, err := dockerManager.GetService(systemConfig.UDPProxyConfig.ServiceName) |
| 126 | + if err != nil { |
| 127 | + printError("UDP Proxy service is not running") |
| 128 | + return |
| 129 | + } |
| 130 | + // Check realtime status of HAProxy service |
| 131 | + info, err := dockerManager.RealtimeInfoService(systemConfig.UDPProxyConfig.ServiceName, false) |
| 132 | + if err != nil { |
| 133 | + printError("Failed to get realtime info of UDP Proxy service") |
| 134 | + return |
| 135 | + } |
| 136 | + // Print service status |
| 137 | + printSuccess("UDP Proxy service is running") |
| 138 | + printInfo("Service : " + systemConfig.UDPProxyConfig.ServiceName) |
| 139 | + printInfo("Image : " + removeHashFromDockerImageName(serviceDetails.Image)) |
| 140 | + printInfo("Running replicas : " + strconv.Itoa(info.RunningReplicas)) |
| 141 | + color.Green("\n--------------Node Names-------------") |
| 142 | + for _, placementInfo := range info.PlacementInfos { |
| 143 | + printInfo(placementInfo.NodeName + " (" + placementInfo.NodeID + ")") |
| 144 | + } |
| 145 | + color.Green("------------------------------------") |
| 146 | + }, |
| 147 | +} |
0 commit comments