blob: 9d653b4299e9bb97def520a97b946ee73714246a [file] [log] [blame]
Lorenz Brun6e8f69c2019-11-18 10:44:24 +01001// Copyright 2020 The Monogon Project Authors.
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
17package kubernetes
18
19import (
20 "errors"
21 "net"
22
Lorenz Brun6e8f69c2019-11-18 10:44:24 +010023 "go.etcd.io/etcd/clientv3"
24 "go.uber.org/zap"
Hendrik Hofstadt8efe51e2020-02-28 12:53:41 +010025
26 "git.monogon.dev/source/nexantic.git/core/internal/common/service"
27 "git.monogon.dev/source/nexantic.git/core/internal/consensus"
Lorenz Brun6e8f69c2019-11-18 10:44:24 +010028)
29
30type Config struct {
31 AdvertiseAddress net.IP
32 ServiceIPRange net.IPNet
33 ClusterNet net.IPNet
34}
35
36type Service struct {
37 *service.BaseService
38 consensusService *consensus.Service
39 logger *zap.Logger
40}
41
42func New(logger *zap.Logger, consensusService *consensus.Service) *Service {
43 s := &Service{
44 consensusService: consensusService,
45 logger: logger,
46 }
47 s.BaseService = service.NewBaseService("kubernetes", logger, s)
48 return s
49}
50
51func (s *Service) getKV() clientv3.KV {
52 return s.consensusService.GetStore("kubernetes", "")
53}
54
55func (s *Service) NewCluster() error {
56 return newCluster(s.getKV())
57}
58
59func (s *Service) OnStart() error {
60 config := Config{
61 AdvertiseAddress: net.IP{10, 0, 2, 15}, // Depends on networking
62 ServiceIPRange: net.IPNet{ // TODO: Decide if configurable / final value
63 IP: net.IP{192, 168, 188, 0},
64 Mask: net.IPMask{0xff, 0xff, 0xff, 0x00}, // /24, but Go stores as a literal mask
65 },
66 ClusterNet: net.IPNet{
67 IP: net.IP{192, 168, 188, 0},
68 Mask: net.IPMask{0xff, 0xff, 0xfd, 0x00}, // /22
69 },
70 }
71 consensusKV := s.getKV()
72 apiserverConfig, err := getPKIApiserverConfig(consensusKV)
73 if err != nil {
74 return err
75 }
76 apiserverConfig.advertiseAddress = config.AdvertiseAddress
77 apiserverConfig.serviceIPRange = config.ServiceIPRange
78 controllerManagerConfig, err := getPKIControllerManagerConfig(consensusKV)
79 if err != nil {
80 return err
81 }
82 controllerManagerConfig.clusterNet = config.ClusterNet
83 schedulerConfig, err := getPKISchedulerConfig(consensusKV)
84 if err != nil {
85 return err
86 }
87
88 go func() {
89 runAPIServer(*apiserverConfig)
90 }()
91 go func() {
92 runControllerManager(*controllerManagerConfig)
93 }()
94 go func() {
95 runScheduler(*schedulerConfig)
96 }()
97
98 return nil
99}
100
101func (s *Service) OnStop() error {
102 // Requires advanced process management and not necessary for MVP
103 return errors.New("Not implemented")
104}