Skip to content

Commit

Permalink
Merge pull request #878 from threefoldtech/networkd_migration
Browse files Browse the repository at this point in the history
Networkd migration
  • Loading branch information
zaibon authored Jul 30, 2020
2 parents 912de08 + c9a77c7 commit d7bb61e
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 14 deletions.
18 changes: 13 additions & 5 deletions pkg/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,16 @@ type Networker interface {
PublicAddresses(ctx context.Context) <-chan NetlinkAddresses
}

// // Network represent the description if a user private network
// type Network struct {
// }
// Network represent the description if a user private network
type Network struct {
Name string `json:"name"`
//unique id inside the reservation is an autoincrement (USE AS NET_ID)
NetID NetID `json:"net_id"`
// IP range of the network, must be an IPv4 /16
IPRange types.IPNet `json:"ip_range"`

NetResources []NetResource `json:"net_resources"`
}

// NetResource is the description of a part of a network local to a specific node
type NetResource struct {
Expand Down Expand Up @@ -112,9 +119,10 @@ type Peer struct {
// NetID is a type defining the ID of a network
type NetID string

// Version of the network workloads keep in cache by networkd
var (
// NetworkSchemaV1 network object schema version 1.0.0
NetworkSchemaV1 = versioned.MustParse("1.0.0")
NetworkSchemaV2 = versioned.MustParse("2.0.0")
// NetworkSchemaLatestVersion network object latest version
NetworkSchemaLatestVersion = NetworkSchemaV1
NetworkSchemaLatestVersion = NetworkSchemaV2
)
43 changes: 39 additions & 4 deletions pkg/network/networker.go
Original file line number Diff line number Diff line change
Expand Up @@ -533,11 +533,12 @@ func (n *networker) DeleteNR(netNR pkg.NetResource) error {

func (n *networker) networkOf(id string) (nr pkg.NetResource, err error) {
path := filepath.Join(n.networkDir, string(id))
file, err := os.Open(path)
file, err := os.OpenFile(path, os.O_RDWR, 0660)
if err != nil {
return nr, err
}
defer file.Close()

reader, err := versioned.NewReader(file)
if versioned.IsNotVersioned(err) {
// old data that doesn't have any version information
Expand All @@ -553,14 +554,48 @@ func (n *networker) networkOf(id string) (nr pkg.NetResource, err error) {
var net pkg.NetResource
dec := json.NewDecoder(reader)

validV1 := versioned.MustParseRange(fmt.Sprintf("<=%s", pkg.NetworkSchemaV1))
version := reader.Version()
validV1 := versioned.MustParseRange(fmt.Sprintf("=%s", pkg.NetworkSchemaV1))
validLatest := versioned.MustParseRange(fmt.Sprintf("<=%s", pkg.NetworkSchemaLatestVersion))

if validV1(version) {
// we found a v1 full network definition, let migrate it to v2 network resource
var network pkg.Network
if err := dec.Decode(&network); err != nil {
return nr, err
}

for _, nr := range network.NetResources {
if nr.NodeID == n.identity.NodeID().Identity() {
net = nr
break
}
}
net.Name = network.Name
net.NetworkIPRange = network.IPRange
net.NetID = network.NetID

// overwrite the old version network with latest version
// old data that doesn't have any version information
if _, err := file.Seek(0, 0); err != nil {
return nr, err
}

writer, err := versioned.NewWriter(file, pkg.NetworkSchemaLatestVersion)
if err != nil {
return nr, err
}

if err := json.NewEncoder(writer).Encode(&net); err != nil {
return nr, err
}

if validV1(reader.Version()) {
} else if validLatest(version) {
if err := dec.Decode(&net); err != nil {
return nr, err
}
} else {
return nr, fmt.Errorf("unknown network object version (%s)", reader.Version())
return nr, fmt.Errorf("unknown network object version (%s)", version)
}

return net, nil
Expand Down
10 changes: 8 additions & 2 deletions pkg/network/nr/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,13 @@ func (nr *NetResource) Join(containerID string, addrs []net.IP, publicIP6 bool)
}

join.Namespace = containerID
netspace, err := namespace.Create(containerID)

var netspace ns.NetNS
if namespace.Exists(containerID) {
netspace, err = namespace.GetByName(containerID)
} else {
netspace, err = namespace.Create(containerID)
}
if err != nil {
return join, err
}
Expand Down Expand Up @@ -100,7 +106,7 @@ func (nr *NetResource) Join(containerID string, addrs []net.IP, publicIP6 bool)
ipnet.IP[len(ipnet.IP)-1] = 0x01

routes := []*netlink.Route{
&netlink.Route{
{
Dst: &net.IPNet{
IP: net.ParseIP("0.0.0.0"),
Mask: net.CIDRMask(0, 32),
Expand Down
8 changes: 5 additions & 3 deletions pkg/provision/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -342,9 +342,11 @@ func (e *Engine) migrateToPool(ctx context.Context, r *Reservation) error {

log.Info().Str("reference", r.Reference).Msg("reservation referencing another one")

// first let make sure both are the same
if !bytes.Equal(oldRes.Data, r.Data) { //TODO: handle network
return fmt.Errorf("trying to upgrade workloads to new version. new workload content is different from the old one. upgrade refused")
if string(oldRes.Type) != "network" { //we skip network cause its a PITA
// first let make sure both are the same
if !bytes.Equal(oldRes.Data, r.Data) {
return fmt.Errorf("trying to upgrade workloads to new version. new workload content is different from the old one. upgrade refused")
}
}

// remove the old one from the cache and store the new one
Expand Down

0 comments on commit d7bb61e

Please sign in to comment.