mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-25 23:11:20 +01:00
294 lines
7.5 KiB
Go
294 lines
7.5 KiB
Go
|
package dockerswarm
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
|
||
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils"
|
||
|
)
|
||
|
|
||
|
func Test_parseServicesResponse(t *testing.T) {
|
||
|
type args struct {
|
||
|
data []byte
|
||
|
}
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
args args
|
||
|
want []service
|
||
|
wantErr bool
|
||
|
}{
|
||
|
{
|
||
|
name: "parse ok",
|
||
|
args: args{
|
||
|
data: []byte(`[
|
||
|
{
|
||
|
"ID": "tgsci5gd31aai3jyudv98pqxf",
|
||
|
"Version": {
|
||
|
"Index": 25
|
||
|
},
|
||
|
"CreatedAt": "2020-10-06T11:17:31.948808444Z",
|
||
|
"UpdatedAt": "2020-10-06T11:17:31.950195138Z",
|
||
|
"Spec": {
|
||
|
"Name": "redis2",
|
||
|
"Labels": {},
|
||
|
"TaskTemplate": {
|
||
|
"ContainerSpec": {
|
||
|
"Image": "redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842",
|
||
|
"Init": false,
|
||
|
"DNSConfig": {},
|
||
|
"Isolation": "default"
|
||
|
},
|
||
|
"Resources": {
|
||
|
"Limits": {},
|
||
|
"Reservations": {}
|
||
|
}
|
||
|
},
|
||
|
"Mode": {
|
||
|
"Replicated": {}
|
||
|
},
|
||
|
"EndpointSpec": {
|
||
|
"Mode": "vip",
|
||
|
"Ports": [
|
||
|
{
|
||
|
"Protocol": "tcp",
|
||
|
"TargetPort": 6379,
|
||
|
"PublishedPort": 8081,
|
||
|
"PublishMode": "ingress"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
},
|
||
|
"Endpoint": {
|
||
|
"Spec": {
|
||
|
"Mode": "vip",
|
||
|
"Ports": [
|
||
|
{
|
||
|
"Protocol": "tcp",
|
||
|
"TargetPort": 6379,
|
||
|
"PublishedPort": 8081,
|
||
|
"PublishMode": "ingress"
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
"Ports": [
|
||
|
{
|
||
|
"Protocol": "tcp",
|
||
|
"TargetPort": 6379,
|
||
|
"PublishedPort": 8081,
|
||
|
"PublishMode": "ingress"
|
||
|
}
|
||
|
],
|
||
|
"VirtualIPs": [
|
||
|
{
|
||
|
"NetworkID": "qs0hog6ldlei9ct11pr3c77v1",
|
||
|
"Addr": "10.0.0.3/24"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
]`),
|
||
|
},
|
||
|
want: []service{
|
||
|
{
|
||
|
ID: "tgsci5gd31aai3jyudv98pqxf",
|
||
|
Spec: struct {
|
||
|
Labels map[string]string
|
||
|
Name string
|
||
|
TaskTemplate struct {
|
||
|
ContainerSpec struct {
|
||
|
Hostname string
|
||
|
Image string
|
||
|
}
|
||
|
}
|
||
|
Mode struct {
|
||
|
Global interface{}
|
||
|
Replicated interface{}
|
||
|
}
|
||
|
}{
|
||
|
Labels: map[string]string{},
|
||
|
Name: "redis2",
|
||
|
TaskTemplate: struct {
|
||
|
ContainerSpec struct {
|
||
|
Hostname string
|
||
|
Image string
|
||
|
}
|
||
|
}{
|
||
|
ContainerSpec: struct {
|
||
|
Hostname string
|
||
|
Image string
|
||
|
}{
|
||
|
Hostname: "",
|
||
|
Image: "redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842",
|
||
|
},
|
||
|
},
|
||
|
Mode: struct {
|
||
|
Global interface{}
|
||
|
Replicated interface{}
|
||
|
}{
|
||
|
Replicated: map[string]interface{}{},
|
||
|
},
|
||
|
},
|
||
|
Endpoint: struct {
|
||
|
Ports []portConfig
|
||
|
VirtualIPs []struct {
|
||
|
NetworkID string
|
||
|
Addr string
|
||
|
}
|
||
|
}{Ports: []portConfig{
|
||
|
{
|
||
|
Protocol: "tcp",
|
||
|
PublishMode: "ingress",
|
||
|
PublishedPort: 8081,
|
||
|
},
|
||
|
}, VirtualIPs: []struct {
|
||
|
NetworkID string
|
||
|
Addr string
|
||
|
}{
|
||
|
{
|
||
|
NetworkID: "qs0hog6ldlei9ct11pr3c77v1",
|
||
|
Addr: "10.0.0.3/24",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
got, err := parseServicesResponse(tt.args.data)
|
||
|
if (err != nil) != tt.wantErr {
|
||
|
t.Errorf("parseServicesResponse() error = %v, wantErr %v", err, tt.wantErr)
|
||
|
return
|
||
|
}
|
||
|
if !reflect.DeepEqual(got, tt.want) {
|
||
|
t.Errorf("parseServicesResponse() \ngot %v, \nwant %v", got, tt.want)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Test_addServicesLabels(t *testing.T) {
|
||
|
type args struct {
|
||
|
services []service
|
||
|
networksLabels []map[string]string
|
||
|
port int
|
||
|
}
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
args args
|
||
|
want [][]prompbmarshal.Label
|
||
|
}{
|
||
|
{
|
||
|
name: "add 2 services with network labels join",
|
||
|
args: args{
|
||
|
port: 9100,
|
||
|
networksLabels: []map[string]string{
|
||
|
{
|
||
|
"__meta_dockerswarm_network_id": "qs0hog6ldlei9ct11pr3c77v1",
|
||
|
"__meta_dockerswarm_network_ingress": "true",
|
||
|
"__meta_dockerswarm_network_internal": "false",
|
||
|
"__meta_dockerswarm_network_label_key1": "value1",
|
||
|
"__meta_dockerswarm_network_name": "ingress",
|
||
|
"__meta_dockerswarm_network_scope": "swarm",
|
||
|
},
|
||
|
},
|
||
|
services: []service{
|
||
|
{
|
||
|
ID: "tgsci5gd31aai3jyudv98pqxf",
|
||
|
Spec: struct {
|
||
|
Labels map[string]string
|
||
|
Name string
|
||
|
TaskTemplate struct {
|
||
|
ContainerSpec struct {
|
||
|
Hostname string
|
||
|
Image string
|
||
|
}
|
||
|
}
|
||
|
Mode struct {
|
||
|
Global interface{}
|
||
|
Replicated interface{}
|
||
|
}
|
||
|
}{
|
||
|
Labels: map[string]string{},
|
||
|
Name: "redis2",
|
||
|
TaskTemplate: struct {
|
||
|
ContainerSpec struct {
|
||
|
Hostname string
|
||
|
Image string
|
||
|
}
|
||
|
}{
|
||
|
ContainerSpec: struct {
|
||
|
Hostname string
|
||
|
Image string
|
||
|
}{
|
||
|
Hostname: "node1",
|
||
|
Image: "redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842",
|
||
|
},
|
||
|
},
|
||
|
Mode: struct {
|
||
|
Global interface{}
|
||
|
Replicated interface{}
|
||
|
}{
|
||
|
Replicated: map[string]interface{}{},
|
||
|
},
|
||
|
},
|
||
|
Endpoint: struct {
|
||
|
Ports []portConfig
|
||
|
VirtualIPs []struct {
|
||
|
NetworkID string
|
||
|
Addr string
|
||
|
}
|
||
|
}{Ports: []portConfig{
|
||
|
{
|
||
|
Protocol: "tcp",
|
||
|
Name: "redis",
|
||
|
PublishMode: "ingress",
|
||
|
},
|
||
|
}, VirtualIPs: []struct {
|
||
|
NetworkID string
|
||
|
Addr string
|
||
|
}{
|
||
|
{
|
||
|
NetworkID: "qs0hog6ldlei9ct11pr3c77v1",
|
||
|
Addr: "10.0.0.3/24",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
want: [][]prompbmarshal.Label{
|
||
|
discoveryutils.GetSortedLabels(map[string]string{
|
||
|
"__address__": "10.0.0.3:0",
|
||
|
"__meta_dockerswarm_network_id": "qs0hog6ldlei9ct11pr3c77v1",
|
||
|
"__meta_dockerswarm_network_ingress": "true",
|
||
|
"__meta_dockerswarm_network_internal": "false",
|
||
|
"__meta_dockerswarm_network_label_key1": "value1",
|
||
|
"__meta_dockerswarm_network_name": "ingress",
|
||
|
"__meta_dockerswarm_network_scope": "swarm",
|
||
|
"__meta_dockerswarm_service_endpoint_port_name": "redis",
|
||
|
"__meta_dockerswarm_service_endpoint_port_publish_mode": "ingress",
|
||
|
"__meta_dockerswarm_service_id": "tgsci5gd31aai3jyudv98pqxf",
|
||
|
"__meta_dockerswarm_service_mode": "replicated",
|
||
|
"__meta_dockerswarm_service_name": "redis2",
|
||
|
"__meta_dockerswarm_service_task_container_hostname": "node1",
|
||
|
"__meta_dockerswarm_service_task_container_image": "redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842",
|
||
|
})},
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
got := addServicesLabels(tt.args.services, tt.args.networksLabels, tt.args.port)
|
||
|
var sortedLabelss [][]prompbmarshal.Label
|
||
|
for _, labels := range got {
|
||
|
sortedLabelss = append(sortedLabelss, discoveryutils.GetSortedLabels(labels))
|
||
|
}
|
||
|
if !reflect.DeepEqual(sortedLabelss, tt.want) {
|
||
|
t.Errorf("addServicesLabels() \ngot %v, \nwant %v", sortedLabelss, tt.want)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|