Питання «чому всі профілі ssh» виявило справжню помилку. Список правильний: ssh — розумний типовий вибір. Але це поле ВИРІШУВАЛО транспорт, а профіль описує модель, не конкретну коробку. Хост зі старою прошивкою, де є лише telnet, і з чесно заведеним telnet-доступом усе одно набирався по SSH — і не збирався ніколи. inv.credentials.proto вже ніс потрібну відповідь і доїжджав до зонда невикористаним. Тепер транспорт бере доступ; профільне поле лишилось підказкою й діє, поки доступу немає. Логіка винесена в jobTransport() — щоб її можна було перевірити без бази й без пристрою. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
64 lines
2 KiB
Go
64 lines
2 KiB
Go
package store
|
||
|
||
import (
|
||
"testing"
|
||
|
||
npv1 "github.com/netpulse/netpulse/gen/go/netpulse/v1"
|
||
)
|
||
|
||
// Транспорт задає доступ хоста, а не профіль моделі.
|
||
//
|
||
// Усі 147 вбудованих профілів кажуть «ssh», бо так знімають з
|
||
// переважної більшості заліза. Але та сама модель у клієнта може стояти
|
||
// зі старою прошивкою, де є лише telnet, — і поки вирішував профіль,
|
||
// такий хост набирався по SSH і не збирався ніколи.
|
||
func TestTransportComesFromCredential(t *testing.T) {
|
||
cases := []struct {
|
||
name string
|
||
profile string
|
||
cred *npv1.Credential
|
||
want npv1.Transport
|
||
port uint32
|
||
}{
|
||
{
|
||
name: "доступ telnet перемагає профіль ssh",
|
||
profile: "ssh",
|
||
cred: &npv1.Credential{Transport: npv1.Transport_TRANSPORT_TELNET},
|
||
want: npv1.Transport_TRANSPORT_TELNET,
|
||
port: 23,
|
||
},
|
||
{
|
||
name: "доступ ssh перемагає профіль telnet",
|
||
profile: "telnet",
|
||
cred: &npv1.Credential{Transport: npv1.Transport_TRANSPORT_SSH},
|
||
want: npv1.Transport_TRANSPORT_SSH,
|
||
port: 22,
|
||
},
|
||
{
|
||
name: "порт з доступу перекриває типовий",
|
||
profile: "ssh",
|
||
cred: &npv1.Credential{Transport: npv1.Transport_TRANSPORT_SSH, Port: 2222},
|
||
want: npv1.Transport_TRANSPORT_SSH,
|
||
port: 2222,
|
||
},
|
||
{
|
||
name: "без доступу лишається підказка профілю",
|
||
profile: "telnet",
|
||
cred: nil,
|
||
want: npv1.Transport_TRANSPORT_TELNET,
|
||
port: 23,
|
||
},
|
||
}
|
||
|
||
for _, c := range cases {
|
||
t.Run(c.name, func(t *testing.T) {
|
||
got, port := jobTransport(c.profile, c.cred)
|
||
if got != c.want {
|
||
t.Fatalf("транспорт: %v, очікував %v", got, c.want)
|
||
}
|
||
if port != c.port {
|
||
t.Fatalf("порт: %d, очікував %d", port, c.port)
|
||
}
|
||
})
|
||
}
|
||
}
|