go/svc/(dc stuff) -> dc/
We want to start keeping codebases separated per 'team'/intent, to then
have simple OWNER files/trees to specify review rules.
This means dc/ stuff can all be OWNED by q3k, and review will only
involve a +1 for style/readability, instead of a +2 for approval.
Change-Id: I05afbc4e1018944b841ec0d88cd24cc95bec8bf1
diff --git a/dc/cmc-proxy/main.go b/dc/cmc-proxy/main.go
new file mode 100644
index 0000000..dc0cfb4
--- /dev/null
+++ b/dc/cmc-proxy/main.go
@@ -0,0 +1,75 @@
+package main
+
+import (
+ "context"
+ "flag"
+
+ "code.hackerspace.pl/hscloud/go/mirko"
+ "github.com/golang/glog"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+
+ pb "code.hackerspace.pl/hscloud/dc/cmc-proxy/proto"
+)
+
+var (
+ flagCMCAddress string
+ flagCMCUsername string
+ flagCMCPassword string
+)
+
+const (
+ pathLogin = "cgi-bin/webcgi/login"
+ pathLogout = "cgi-bin/webcgi/logout"
+ pathiDRACURL = "cgi-bin/webcgi/blade_iDRAC_url"
+)
+
+func init() {
+ flag.Set("logtostderr", "true")
+}
+
+type service struct {
+ cmc *cmcClient
+}
+
+func (s *service) GetKVMData(ctx context.Context, req *pb.GetKVMDataRequest) (*pb.GetKVMDataResponse, error) {
+ if req.BladeNum < 1 || req.BladeNum > 16 {
+ return nil, status.Error(codes.InvalidArgument, "blade_num must be [1,16]")
+ }
+
+ details, err := s.cmc.RequestKVMDetails(ctx, int(req.BladeNum))
+ if err != nil {
+ glog.Errorf("RequestKVMDetails(_, %d): %v", req.BladeNum, err)
+ return nil, status.Error(codes.Unavailable, "CMC unavailable")
+ }
+
+ return &pb.GetKVMDataResponse{
+ Arguments: details.arguments,
+ }, nil
+}
+
+func main() {
+ flag.StringVar(&flagCMCAddress, "cmc_address", "https://10.10.10.10", "URL of Dell M1000e CMC")
+ flag.StringVar(&flagCMCUsername, "cmc_username", "root", "Login username for CMC")
+ flag.StringVar(&flagCMCPassword, "cmc_password", "", "Login password for CMC")
+ flag.Parse()
+
+ m := mirko.New()
+ if err := m.Listen(); err != nil {
+ glog.Exitf("Could not listen: %v", err)
+ }
+
+ s := &service{
+ cmc: NewCMCClient(),
+ }
+ pb.RegisterCMCProxyServer(m.GRPC(), s)
+
+ if err := m.Serve(); err != nil {
+ glog.Exitf("Could not run: %v", err)
+ }
+
+ go s.cmc.Run(m.Context())
+ glog.Info("Running.")
+
+ <-m.Done()
+}