mirror of
https://github.com/siderolabs/talos.git
synced 2025-08-20 14:11:11 +02:00
This change is only moving packages and updating import paths. Goal: expose `internal/pkg/provision` as `pkg/provision` to enable other projects to import Talos provisioning library. As cluster checks are almost always required as part of provisioning process, package `internal/pkg/cluster` was also made public as `pkg/cluster`. Other changes were direct dependencies discovered by `importvet` which were updated. Public packages (useful, general purpose packages with stable API): * `internal/pkg/conditions` -> `pkg/conditions` * `internal/pkg/tail` -> `pkg/tail` Private packages (used only on provisioning library internally): * `internal/pkg/inmemhttp` -> `pkg/provision/internal/inmemhttp` * `internal/pkg/kernel/vmlinuz` -> `pkg/provision/internal/vmlinuz` * `internal/pkg/cniutils` -> `pkg/provision/internal/cniutils` Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
88 lines
2.3 KiB
Go
88 lines
2.3 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package docker
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/filters"
|
|
"github.com/docker/docker/api/types/network"
|
|
"github.com/hashicorp/go-multierror"
|
|
|
|
"github.com/talos-systems/talos/pkg/provision"
|
|
)
|
|
|
|
// createNetwork will take a network request and check if a network with the same name + cidr exists.
|
|
// If so, it simply returns without error and assumes we will re-use that network. Otherwise it will create a new one.
|
|
func (p *provisioner) createNetwork(ctx context.Context, req provision.NetworkRequest) error {
|
|
existingNet, err := p.listNetworks(ctx, req.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// If named net already exists, see if we can reuse it
|
|
if len(existingNet) > 0 {
|
|
if existingNet[0].IPAM.Config[0].Subnet != req.CIDR.String() {
|
|
return fmt.Errorf("existing network has differing cidr: %s vs %s", existingNet[0].IPAM.Config[0].Subnet, req.CIDR.String())
|
|
}
|
|
// CIDRs match, we'll reuse
|
|
return nil
|
|
}
|
|
|
|
// Create new net
|
|
options := types.NetworkCreate{
|
|
Labels: map[string]string{
|
|
"talos.owned": "true",
|
|
"talos.cluster.name": req.Name,
|
|
},
|
|
IPAM: &network.IPAM{
|
|
Config: []network.IPAMConfig{
|
|
{
|
|
Subnet: req.CIDR.String(),
|
|
},
|
|
},
|
|
},
|
|
Options: map[string]string{
|
|
"com.docker.network.driver.mtu": strconv.Itoa(req.MTU),
|
|
},
|
|
}
|
|
|
|
_, err = p.client.NetworkCreate(ctx, req.Name, options)
|
|
|
|
return err
|
|
}
|
|
|
|
func (p *provisioner) listNetworks(ctx context.Context, name string) ([]types.NetworkResource, error) {
|
|
filters := filters.NewArgs()
|
|
filters.Add("label", "talos.owned=true")
|
|
filters.Add("label", "talos.cluster.name="+name)
|
|
|
|
options := types.NetworkListOptions{
|
|
Filters: filters,
|
|
}
|
|
|
|
return p.client.NetworkList(ctx, options)
|
|
}
|
|
|
|
func (p *provisioner) destroyNetwork(ctx context.Context, name string) error {
|
|
networks, err := p.listNetworks(ctx, name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var result *multierror.Error
|
|
|
|
for _, network := range networks {
|
|
if err := p.client.NetworkRemove(ctx, network.ID); err != nil {
|
|
result = multierror.Append(result, err)
|
|
}
|
|
}
|
|
|
|
return result.ErrorOrNil()
|
|
}
|