blob: 57f2822e1d5aa324b1138bb7825004a071aa2fc4 [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
23 "git.monogon.dev/source/nexantic.git/core/internal/common/service"
24 "git.monogon.dev/source/nexantic.git/core/internal/consensus"
25 "go.etcd.io/etcd/clientv3"
26 "go.uber.org/zap"
27)
28
29type Config struct {
30 AdvertiseAddress net.IP
31 ServiceIPRange net.IPNet
32 ClusterNet net.IPNet
33}
34
35type Service struct {
36 *service.BaseService
37 consensusService *consensus.Service
38 logger *zap.Logger
39}
40
41func New(logger *zap.Logger, consensusService *consensus.Service) *Service {
42 s := &Service{
43 consensusService: consensusService,
44 logger: logger,
45 }
46 s.BaseService = service.NewBaseService("kubernetes", logger, s)
47 return s
48}
49
50func (s *Service) getKV() clientv3.KV {
51 return s.consensusService.GetStore("kubernetes", "")
52}
53
54func (s *Service) NewCluster() error {
55 return newCluster(s.getKV())
56}
57
58func (s *Service) OnStart() error {
59 config := Config{
60 AdvertiseAddress: net.IP{10, 0, 2, 15}, // Depends on networking
61 ServiceIPRange: net.IPNet{ // TODO: Decide if configurable / final value
62 IP: net.IP{192, 168, 188, 0},
63 Mask: net.IPMask{0xff, 0xff, 0xff, 0x00}, // /24, but Go stores as a literal mask
64 },
65 ClusterNet: net.IPNet{
66 IP: net.IP{192, 168, 188, 0},
67 Mask: net.IPMask{0xff, 0xff, 0xfd, 0x00}, // /22
68 },
69 }
70 consensusKV := s.getKV()
71 apiserverConfig, err := getPKIApiserverConfig(consensusKV)
72 if err != nil {
73 return err
74 }
75 apiserverConfig.advertiseAddress = config.AdvertiseAddress
76 apiserverConfig.serviceIPRange = config.ServiceIPRange
77 controllerManagerConfig, err := getPKIControllerManagerConfig(consensusKV)
78 if err != nil {
79 return err
80 }
81 controllerManagerConfig.clusterNet = config.ClusterNet
82 schedulerConfig, err := getPKISchedulerConfig(consensusKV)
83 if err != nil {
84 return err
85 }
86
87 go func() {
88 runAPIServer(*apiserverConfig)
89 }()
90 go func() {
91 runControllerManager(*controllerManagerConfig)
92 }()
93 go func() {
94 runScheduler(*schedulerConfig)
95 }()
96
97 return nil
98}
99
100func (s *Service) OnStop() error {
101 // Requires advanced process management and not necessary for MVP
102 return errors.New("Not implemented")
103}