|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + "os" |
| 6 | + "strconv" |
| 7 | + "strings" |
| 8 | + |
| 9 | + proto "github.com/container-storage-interface/spec/lib/go/csi" |
| 10 | + "github.com/go-kit/kit/log" |
| 11 | + "github.com/go-kit/kit/log/level" |
| 12 | + "github.com/hetznercloud/csi-driver/api" |
| 13 | + "github.com/hetznercloud/csi-driver/app" |
| 14 | + "github.com/hetznercloud/csi-driver/driver" |
| 15 | + "github.com/hetznercloud/csi-driver/volumes" |
| 16 | + "github.com/hetznercloud/hcloud-go/hcloud/metadata" |
| 17 | +) |
| 18 | + |
| 19 | +var logger log.Logger |
| 20 | + |
| 21 | +func main() { |
| 22 | + logger = app.CreateLogger() |
| 23 | + |
| 24 | + m := app.CreateMetrics(logger) |
| 25 | + |
| 26 | + hcloudClient, err := app.CreateHcloudClient(m.Registry(), logger) |
| 27 | + if err != nil { |
| 28 | + level.Error(logger).Log( |
| 29 | + "msg", "failed to initialize hcloud client", |
| 30 | + "err", err, |
| 31 | + ) |
| 32 | + os.Exit(1) |
| 33 | + } |
| 34 | + |
| 35 | + metadataClient := metadata.NewClient(metadata.WithInstrumentation(m.Registry())) |
| 36 | + |
| 37 | + // node |
| 38 | + serverID, err := metadataClient.InstanceID() |
| 39 | + if err != nil { |
| 40 | + level.Error(logger).Log("msg", "failed to fetch server ID from metadata service", "err", err) |
| 41 | + os.Exit(1) |
| 42 | + } |
| 43 | + |
| 44 | + serverAZ, err := metadataClient.AvailabilityZone() |
| 45 | + if err != nil { |
| 46 | + level.Error(logger).Log("msg", "failed to fetch server availability-zone from metadata service", "err", err) |
| 47 | + os.Exit(1) |
| 48 | + } |
| 49 | + parts := strings.Split(serverAZ, "-") |
| 50 | + if len(parts) != 2 { |
| 51 | + level.Error(logger).Log("msg", fmt.Sprintf("unexpected server availability zone: %s", serverAZ), "err", err) |
| 52 | + os.Exit(1) |
| 53 | + } |
| 54 | + serverLocation := parts[0] |
| 55 | + |
| 56 | + level.Info(logger).Log("msg", "Fetched data from metadata service", "id", serverID, "location", serverLocation) |
| 57 | + |
| 58 | + volumeMountService := volumes.NewLinuxMountService( |
| 59 | + log.With(logger, "component", "linux-mount-service"), |
| 60 | + ) |
| 61 | + volumeResizeService := volumes.NewLinuxResizeService( |
| 62 | + log.With(logger, "component", "linux-resize-service"), |
| 63 | + ) |
| 64 | + volumeStatsService := volumes.NewLinuxStatsService( |
| 65 | + log.With(logger, "component", "linux-stats-service"), |
| 66 | + ) |
| 67 | + nodeService := driver.NewNodeService( |
| 68 | + log.With(logger, "component", "driver-node-service"), |
| 69 | + strconv.Itoa(serverID), |
| 70 | + serverLocation, |
| 71 | + volumeMountService, |
| 72 | + volumeResizeService, |
| 73 | + volumeStatsService, |
| 74 | + ) |
| 75 | + |
| 76 | + // controller |
| 77 | + volumeService := volumes.NewIdempotentService( |
| 78 | + log.With(logger, "component", "idempotent-volume-service"), |
| 79 | + api.NewVolumeService( |
| 80 | + log.With(logger, "component", "api-volume-service"), |
| 81 | + hcloudClient, |
| 82 | + ), |
| 83 | + ) |
| 84 | + controllerService := driver.NewControllerService( |
| 85 | + log.With(logger, "component", "driver-controller-service"), |
| 86 | + volumeService, |
| 87 | + serverLocation, |
| 88 | + ) |
| 89 | + |
| 90 | + // common |
| 91 | + identityService := driver.NewIdentityService( |
| 92 | + log.With(logger, "component", "driver-identity-service"), |
| 93 | + ) |
| 94 | + |
| 95 | + // common |
| 96 | + listener, err := app.CreateListener() |
| 97 | + if err != nil { |
| 98 | + level.Error(logger).Log( |
| 99 | + "msg", "failed to create listener", |
| 100 | + "err", err, |
| 101 | + ) |
| 102 | + os.Exit(1) |
| 103 | + } |
| 104 | + |
| 105 | + grpcServer := app.CreateGRPCServer(logger, m.UnaryServerInterceptor()) |
| 106 | + |
| 107 | + // controller |
| 108 | + proto.RegisterControllerServer(grpcServer, controllerService) |
| 109 | + // common |
| 110 | + proto.RegisterIdentityServer(grpcServer, identityService) |
| 111 | + // node |
| 112 | + proto.RegisterNodeServer(grpcServer, nodeService) |
| 113 | + |
| 114 | + m.InitializeMetrics(grpcServer) |
| 115 | + |
| 116 | + identityService.SetReady(true) |
| 117 | + |
| 118 | + if err := grpcServer.Serve(listener); err != nil { |
| 119 | + level.Error(logger).Log( |
| 120 | + "msg", "grpc server failed", |
| 121 | + "err", err, |
| 122 | + ) |
| 123 | + os.Exit(1) |
| 124 | + } |
| 125 | +} |
0 commit comments