Skip to content
This repository was archived by the owner on Mar 27, 2026. It is now read-only.

Commit 5979e63

Browse files
authored
Move to commons (#16)
* Use IsHost from util * Move ParseSegments to util and adjust to []string since we don't use CLI anymore * Use DecodeSRv6Endpoint and EncodeSRv6Endpoint from util * Use Hex/Base64 convert from util * mod 🧹
1 parent e192293 commit 5979e63

File tree

4 files changed

+26
-85
lines changed

4 files changed

+26
-85
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ module github.com/datum-cloud/galactic-agent
33
go 1.24.9
44

55
require (
6-
github.com/datum-cloud/galactic-common v0.0.0-20251028162316-06f70d39f8ed
6+
github.com/datum-cloud/galactic-common v0.0.0-20251028201425-f06de7d6ad01
77
github.com/eclipse/paho.mqtt.golang v1.5.0
8-
github.com/kenshaw/baseconv v0.1.1
98
github.com/spf13/cobra v1.9.1
109
github.com/spf13/viper v1.20.1
1110
github.com/vishvananda/netlink v1.3.2-0.20250622222046-78aca1ace529
@@ -20,6 +19,7 @@ require (
2019
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
2120
github.com/gorilla/websocket v1.5.3 // indirect
2221
github.com/inconshreveable/mousetrap v1.1.0 // indirect
22+
github.com/kenshaw/baseconv v0.1.1 // indirect
2323
github.com/lorenzosaino/go-sysctl v0.3.1 // indirect
2424
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
2525
github.com/sagikazarmark/locafero v0.7.0 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
22
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
33
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
4-
github.com/datum-cloud/galactic-common v0.0.0-20251028162316-06f70d39f8ed h1:g1FgebSEgbJGq3RpB6GsJAObUFChP2IuP1OwBqINRlU=
5-
github.com/datum-cloud/galactic-common v0.0.0-20251028162316-06f70d39f8ed/go.mod h1:lJ8fte6gUiIi7cecSrfvicTQMgq+ejFrdN97ElARDR8=
4+
github.com/datum-cloud/galactic-common v0.0.0-20251028201425-f06de7d6ad01 h1:NYfkB6qPWPp0+mgpcr9R2v56efAZNbaetZPAazjkl/M=
5+
github.com/datum-cloud/galactic-common v0.0.0-20251028201425-f06de7d6ad01/go.mod h1:gXCoJaHM1Yy8au9VdKNbKJBGIKbqcPdfKvd9lQ9UNyM=
66
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
77
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
88
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

main.go

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ package main
22

33
import (
44
"context"
5-
"encoding/binary"
6-
"fmt"
7-
"golang.org/x/sync/errgroup"
85
"log"
9-
"net"
106
"os"
117
"os/signal"
12-
"strconv"
138
"syscall"
149

10+
"golang.org/x/sync/errgroup"
11+
1512
"github.com/spf13/cobra"
1613
"github.com/spf13/viper"
1714

@@ -20,6 +17,7 @@ import (
2017
"github.com/datum-cloud/galactic-agent/api/local"
2118
"github.com/datum-cloud/galactic-agent/api/remote"
2219
"github.com/datum-cloud/galactic-agent/srv6"
20+
"github.com/datum-cloud/galactic-common/util"
2321
)
2422

2523
var configFile string
@@ -58,15 +56,15 @@ func main() {
5856
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
5957
defer stop() //nolint:errcheck
6058

61-
_, err := EncodeVPCToSRv6Endpoint(viper.GetString("srv6_net"), "ffffffffffff", "ffff")
59+
_, err := util.EncodeSRv6Endpoint(viper.GetString("srv6_net"), "ffffffffffff", "ffff")
6260
if err != nil {
6361
log.Fatalf("srv6_endpoint invalid: %v", err)
6462
}
6563

6664
l = local.Local{
6765
SocketPath: viper.GetString("socket_path"),
6866
RegisterHandler: func(vpc, vpcAttachment string, networks []string) error {
69-
srv6_endpoint, err := EncodeVPCToSRv6Endpoint(viper.GetString("srv6_net"), vpc, vpcAttachment)
67+
srv6_endpoint, err := util.EncodeSRv6Endpoint(viper.GetString("srv6_net"), vpc, vpcAttachment)
7068
if err != nil {
7169
return err
7270
}
@@ -91,7 +89,7 @@ func main() {
9189
return nil
9290
},
9391
DeregisterHandler: func(vpc, vpcAttachment string, networks []string) error {
94-
srv6_endpoint, err := EncodeVPCToSRv6Endpoint(viper.GetString("srv6_net"), vpc, vpcAttachment)
92+
srv6_endpoint, err := util.EncodeSRv6Endpoint(viper.GetString("srv6_net"), vpc, vpcAttachment)
9593
if err != nil {
9694
return err
9795
}
@@ -167,29 +165,3 @@ func main() {
167165
log.Fatalf("Execution failed: %v", err)
168166
}
169167
}
170-
171-
func EncodeVPCToSRv6Endpoint(srv6_net, vpc, vpcAttachment string) (string, error) {
172-
ip, ipnet, err := net.ParseCIDR(srv6_net)
173-
if err != nil {
174-
return "", err
175-
}
176-
if ip.To4() != nil {
177-
return "", fmt.Errorf("provided srv6_net is not IPv6: %s", srv6_net)
178-
}
179-
mask_len, _ := ipnet.Mask.Size()
180-
if mask_len > 64 {
181-
return "", fmt.Errorf("srv6_net must be at least 64 bits long")
182-
}
183-
184-
vpcInt, err := strconv.ParseUint(vpc, 16, 64)
185-
if err != nil {
186-
return "", fmt.Errorf("invalid vpc %q: %w", vpc, err)
187-
}
188-
vpcAttachmentInt, err := strconv.ParseUint(vpcAttachment, 16, 16)
189-
if err != nil {
190-
return "", fmt.Errorf("invalid vpcAttachment %q: %w", vpcAttachment, err)
191-
}
192-
193-
binary.BigEndian.PutUint64(ip[8:16], (vpcInt<<16)|vpcAttachmentInt)
194-
return ip.String(), nil
195-
}

srv6/srv6.go

Lines changed: 16 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ package srv6
33
import (
44
"errors"
55
"fmt"
6-
"net"
7-
"strings"
86

9-
"github.com/kenshaw/baseconv"
107
"github.com/vishvananda/netlink"
118

129
"github.com/datum-cloud/galactic-agent/srv6/neighborproxy"
@@ -20,15 +17,15 @@ func RouteIngressAdd(ipStr string) error {
2017
if err != nil {
2118
return fmt.Errorf("invalid ip: %w", err)
2219
}
23-
vpc, vpcAttachment, err := util.ExtractVPCFromSRv6Endpoint(ip)
20+
vpc, vpcAttachment, err := util.DecodeSRv6Endpoint(ip)
2421
if err != nil {
2522
return fmt.Errorf("could not extract SRv6 endpoint: %w", err)
2623
}
27-
vpc, err = ToBase62(vpc)
24+
vpc, err = util.HexToBase62(vpc)
2825
if err != nil {
2926
return fmt.Errorf("invalid vpc: %w", err)
3027
}
31-
vpcAttachment, err = ToBase62(vpcAttachment)
28+
vpcAttachment, err = util.HexToBase62(vpcAttachment)
3229
if err != nil {
3330
return fmt.Errorf("invalid vpcattachment: %w", err)
3431
}
@@ -44,15 +41,15 @@ func RouteIngressDel(ipStr string) error {
4441
if err != nil {
4542
return fmt.Errorf("invalid ip: %w", err)
4643
}
47-
vpc, vpcAttachment, err := util.ExtractVPCFromSRv6Endpoint(ip)
44+
vpc, vpcAttachment, err := util.DecodeSRv6Endpoint(ip)
4845
if err != nil {
4946
return fmt.Errorf("could not extract SRv6 endpoint: %w", err)
5047
}
51-
vpc, err = ToBase62(vpc)
48+
vpc, err = util.HexToBase62(vpc)
5249
if err != nil {
5350
return fmt.Errorf("invalid vpc: %w", err)
5451
}
55-
vpcAttachment, err = ToBase62(vpcAttachment)
52+
vpcAttachment, err = util.HexToBase62(vpcAttachment)
5653
if err != nil {
5754
return fmt.Errorf("invalid vpcattachment: %w", err)
5855
}
@@ -72,26 +69,26 @@ func RouteEgressAdd(prefixStr, srcStr string, segmentsStr []string) error {
7269
if err != nil {
7370
return fmt.Errorf("invalid src: %w", err)
7471
}
75-
segments, err := ParseSegments(segmentsStr)
72+
segments, err := util.ParseSegments(segmentsStr)
7673
if err != nil {
7774
return fmt.Errorf("invalid segments: %w", err)
7875
}
7976

80-
vpc, vpcAttachment, err := util.ExtractVPCFromSRv6Endpoint(src)
77+
vpc, vpcAttachment, err := util.DecodeSRv6Endpoint(src)
8178
if err != nil {
8279
return fmt.Errorf("could not extract SRv6 endpoint: %w", err)
8380
}
84-
vpc, err = ToBase62(vpc)
81+
vpc, err = util.HexToBase62(vpc)
8582
if err != nil {
8683
return fmt.Errorf("invalid vpc: %w", err)
8784
}
88-
vpcAttachment, err = ToBase62(vpcAttachment)
85+
vpcAttachment, err = util.HexToBase62(vpcAttachment)
8986
if err != nil {
9087
return fmt.Errorf("invalid vpcattachment: %w", err)
9188
}
9289

9390
var errs []error
94-
if IsHost(prefix) {
91+
if util.IsHost(prefix) {
9592
if err := neighborproxy.Add(prefix, vpc, vpcAttachment); err != nil {
9693
errs = append(errs, fmt.Errorf("neighborproxy add failed: %w", err))
9794
}
@@ -114,26 +111,26 @@ func RouteEgressDel(prefixStr, srcStr string, segmentsStr []string) error {
114111
if err != nil {
115112
return fmt.Errorf("invalid src: %w", err)
116113
}
117-
segments, err := ParseSegments(segmentsStr)
114+
segments, err := util.ParseSegments(segmentsStr)
118115
if err != nil {
119116
return fmt.Errorf("invalid segments: %w", err)
120117
}
121118

122-
vpc, vpcAttachment, err := util.ExtractVPCFromSRv6Endpoint(src)
119+
vpc, vpcAttachment, err := util.DecodeSRv6Endpoint(src)
123120
if err != nil {
124121
return fmt.Errorf("could not extract SRv6 endpoint: %w", err)
125122
}
126-
vpc, err = ToBase62(vpc)
123+
vpc, err = util.HexToBase62(vpc)
127124
if err != nil {
128125
return fmt.Errorf("invalid vpc: %w", err)
129126
}
130-
vpcAttachment, err = ToBase62(vpcAttachment)
127+
vpcAttachment, err = util.HexToBase62(vpcAttachment)
131128
if err != nil {
132129
return fmt.Errorf("invalid vpcattachment: %w", err)
133130
}
134131

135132
var errs []error
136-
if IsHost(prefix) {
133+
if util.IsHost(prefix) {
137134
if err := neighborproxy.Delete(prefix, vpc, vpcAttachment); err != nil {
138135
errs = append(errs, fmt.Errorf("neighborproxy delete failed: %w", err))
139136
}
@@ -146,31 +143,3 @@ func RouteEgressDel(prefixStr, srcStr string, segmentsStr []string) error {
146143
}
147144
return nil
148145
}
149-
150-
func ToBase62(value string) (string, error) {
151-
return baseconv.Convert(strings.ToLower(value), baseconv.DigitsHex, baseconv.Digits62)
152-
}
153-
154-
func IsHost(ipNet *net.IPNet) bool {
155-
ones, bits := ipNet.Mask.Size()
156-
// host if mask is full length: /32 for IPv4, /128 for IPv6
157-
return ones == bits
158-
}
159-
160-
func ParseSegments(input []string) ([]net.IP, error) {
161-
var segments []net.IP
162-
for _, ipStr := range input {
163-
ip, err := util.ParseIP(ipStr)
164-
if err != nil {
165-
return nil, fmt.Errorf("could not parse ip (%s): %v", ipStr, err)
166-
}
167-
if ip.To4() != nil {
168-
return nil, fmt.Errorf("not an ipv6 address: %s", ipStr)
169-
}
170-
segments = append([]net.IP{ip}, segments...)
171-
}
172-
if len(segments) == 0 {
173-
return nil, fmt.Errorf("no segments parsed: %v", input)
174-
}
175-
return segments, nil
176-
}

0 commit comments

Comments
 (0)