This repository has been archived by the owner on Dec 29, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathmain.go
107 lines (82 loc) · 3.04 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
Copyright 2017 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"context"
"flag"
"html/template"
"io/ioutil"
"net"
pb "github.com/google/vmregistry/api"
"github.com/google/vmregistry/server"
"github.com/google/vmregistry/web"
"github.com/golang/glog"
"github.com/google/go-microservice-helpers/server"
"github.com/google/go-microservice-helpers/tracing"
"github.com/libvirt/libvirt-go"
)
var (
libvirtURI = flag.String("libvirt-uri", "", "libvirt connection uri")
vmTemplate = flag.String("vm-template-file", "", "path to libvirt xml template file to be used for vm creation")
vmNet = flag.String("vm-net", "", "A subnet for VM ip address generation")
vmVG = flag.String("vm-vg", "", "lvm volume group for storage")
lvmdAddress = flag.String("lvmd-address", "", "lvmd grpc address")
lvmdCA = flag.String("lvmd-ca", "", "lvmd server ca")
dnsAPIURL = flag.String("pdns-api-url", "", "PowerDNS base URL")
dnsZone = flag.String("pdns-zone", "", "Zone to host VMs")
dnsAPIKey = flag.String("pdns-api-key", "", "PowerDNS API Key")
)
func main() {
flag.Parse()
defer glog.Flush()
conn, err := libvirt.NewConnect(*libvirtURI)
if err != nil {
glog.Fatalf("failed to connect to libvirt: %v", err)
}
err = tracing.InitTracer(*serverhelpers.ListenAddress, "vmregistry")
if err != nil {
glog.Fatalf("failed to init tracing interface: %v", err)
}
_, net, err := net.ParseCIDR(*vmNet)
if err != nil {
glog.Fatalf("failed to parse vm net: %v", err)
}
grpcServer, credstoreClient, err := serverhelpers.NewServer()
if err != nil {
glog.Fatalf("failed to init GRPC server: %v", err)
}
if credstoreClient == nil {
glog.Fatalf("failed to init credstore")
}
lvmSessionTok, err := credstoreClient.GetTokenForRemote(context.Background(), *lvmdAddress)
if err != nil {
glog.Fatalf("failed to get lvmd token: %v", err)
}
storage, err := server.NewLVMStorage(*lvmdAddress, *lvmdCA, *vmVG, lvmSessionTok)
if err != nil {
glog.Fatalf("failed to create connection to lvmd: %v", err)
}
tpl, err := ioutil.ReadFile(*vmTemplate)
if err != nil {
glog.Fatalf("failed to load vm template: %v", err)
}
var xmlTemplate = template.Must(template.New("domain").Parse(string(tpl)))
dnsCli := server.NewDNSClient(*dnsAPIURL, *dnsZone, *dnsAPIKey)
svr := server.NewServer(conn, storage, net, dnsCli, xmlTemplate)
pb.RegisterVMRegistryServer(grpcServer, &svr)
statusHandler := web.NewStatusHandler(&svr)
err = serverhelpers.ListenAndServe(grpcServer, statusHandler)
if err != nil {
glog.Fatalf("failed to serve: %v", err)
}
}