Skip to content
This repository has been archived by the owner on Nov 25, 2020. It is now read-only.

Commit

Permalink
support fixed ip for container without label (#3)
Browse files Browse the repository at this point in the history
Co-authored-by: nyanpassu <nyanpassu@outlook.com>
  • Loading branch information
雾雨 and nyanpassu authored Jul 24, 2020
1 parent 38787c8 commit bee196f
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 8 deletions.
53 changes: 50 additions & 3 deletions install.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,51 @@
cp --parents /eru/minions.conf /etc/
cp eru-minions.service /usr/lib/systemd/system/
#!/bin/bash
declare -a FILES=(
"minions.conf" "/etc/eru/"
"eru-minions" "/usr/bin/"
"eru-minions.service" "/usr/lib/systemd/system/"
)

clear_file () {
if [ -e "$1" ];
then
echo "remove $1"
rm $1
else
echo "$1 not exists"
fi
}

copy_file () {
echo "copy $1 to $2"
cp $1 $2
}

if [ -d "/etc/eru" ];
then
echo "/etc/eru exists"
else
echo "create /etc/eru"
mkdir -p /etc/eru
fi

echo "===stop service==="
systemctl stop eru-minions.service
systemctl disable eru-minions.service

echo "===remove old files==="
for i in $(eval echo "{0..$((${#FILES[@]} - 1))..2}")
do
clear_file "${FILES[$((i + 1))]}${FILES[${i}]}"
done

echo "===copy new files==="
for i in $(eval echo "{0..$((${#FILES[@]} - 1))..2}")
do
copy_file "${FILES[${i}]}" "${FILES[$((i + 1))]}"
done

echo "===start service==="
systemctl enable eru-minions.service
systemctl start eru-minions.service
systemctl start eru-minions.service

echo "===minions install success==="
34 changes: 29 additions & 5 deletions internal/driver/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -553,15 +553,25 @@ func (d NetworkDriver) Join(request *network.JoinRequest) (*network.JoinResponse
return resp, nil
}

// Leave .
func (d NetworkDriver) Leave(request *network.LeaveRequest) error {
logutils.JSONMessage("Leave response", request)
container, address, err := d.findDockerContainerByEndpointId(request.EndpointID)
if err != nil {
var (
container dockerTypes.Container
address string
shouldReserveIP bool
err error
)
if container, address, err = d.findDockerContainerByEndpointId(request.EndpointID); err != nil {
return err
}
// reserve ip here by container label
if containerHasFixedIPLabel(container) {
if err := d.ripam.Reserve(address, container.ID); err != nil {
if shouldReserveIP, err = d.shouldReserveIP(container, address); err != nil {
// we move on when trying to find out whether should reserve by reserve request mark
log.Errorln(err)
}
if shouldReserveIP {
if err = d.ripam.Reserve(address, container.ID); err != nil {
// we move on when reserve is failed
log.Errorln(err)
}
}
Expand All @@ -570,6 +580,20 @@ func (d NetworkDriver) Leave(request *network.LeaveRequest) error {
return netns.RemoveVeth(caliName)
}

func (d NetworkDriver) shouldReserveIP(container dockerTypes.Container, address string) (shouldReserve bool, err error) {
// reserve ip here by container label
if containerHasFixedIPLabel(container) {
shouldReserve = true
return
}
// reserve ip here by reserve request mark
if shouldReserve, err = d.ripam.ConsumeRequestMarkIfPresent(address); err != nil {
// ensure shouldReserve is false here when err is not nil
shouldReserve = false
}
return
}

func (d NetworkDriver) DiscoverNew(request *network.DiscoveryNotification) error {
logutils.JSONMessage("DiscoverNew", request)
log.Debugln("DiscoverNew response JSON={}")
Expand Down
7 changes: 7 additions & 0 deletions internal/driver/reservedip.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ type ReservedIPManager interface {
Reserve(ip string, containerID string) error
AquireIfReserved(ip string) (bool, error)
IsReserved(ip string) (bool, error)
// marked is not guaranteed to be false when err is not nil
ConsumeRequestMarkIfPresent(ip string) (marked bool, err error)
}

// NewReservedIPManager .
Expand All @@ -36,6 +38,11 @@ func (ripam reservedIPManager) IsReserved(ip string) (bool, error) {
return ripam.etcd.Get(&lib.ReservedIPAddress{Address: ip})
}

// IsRequested .
func (ripam reservedIPManager) ConsumeRequestMarkIfPresent(ip string) (bool, error) {
return ripam.etcd.GetAndDelete(&lib.ReserveRequest{Address: ip})
}

// AquireIfReserved .
func (ripam reservedIPManager) AquireIfReserved(ip string) (bool, error) {
log.Infof("AquireIPIfReserved ip = %s", ip)
Expand Down
10 changes: 10 additions & 0 deletions lib/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
// Client .
type Client interface {
ReleaseReservedIPByTiedContainerIDIfIdle(containerID string) error
MarkReserveRequestForIP(ip string) error
}

type client struct {
Expand Down Expand Up @@ -58,3 +59,12 @@ func (client client) ReleaseReservedIPByTiedContainerIDIfIdle(containerID string

return nil
}

func (client client) MarkReserveRequestForIP(ip string) (err error) {
var reserved bool
request := ReservedIPAddress{Address: ip}
if reserved, err = client.etcd.Get(&request); reserved || err != nil {
return
}
return client.etcd.Put(&request)
}
38 changes: 38 additions & 0 deletions lib/reservereq.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package lib

import (
"encoding/json"
"fmt"

"github.com/coreos/etcd/mvcc/mvccpb"
)

// ReserveRequest .
type ReserveRequest struct {
Address string
version int64
}

// Key .
func (req *ReserveRequest) Key() string {
if req.Address == "" {
return ""
}
return fmt.Sprintf("/barrel/reservereq/%s", req.Address)
}

// Read .
func (req *ReserveRequest) Read(ekv *mvccpb.KeyValue) error {
req.version = ekv.Version
return json.Unmarshal(ekv.Value, req)
}

// JSON .
func (req *ReserveRequest) JSON() string {
return fmt.Sprintf(`{"Address":"%s"}`, req.Address)
}

// Version .
func (req *ReserveRequest) Version() int64 {
return req.version
}

0 comments on commit bee196f

Please sign in to comment.