diff --git a/cmd/start.go b/cmd/start.go index c569339e37dea923afc30a1d8a63681d12c4a9df..910ec8b84362110ba483b494a698c697bf4246f9 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -36,7 +36,6 @@ import ( "code.fbi.h-da.de/danet/ekms/etsiqkdnclient" "code.fbi.h-da.de/danet/ekms/handlers/danet" - "code.fbi.h-da.de/danet/ekms/handlers/etsi" "code.fbi.h-da.de/danet/ekms/handlers/system" gnmitargetygot "code.fbi.h-da.de/danet/ekms/model" "code.fbi.h-da.de/danet/ekms/restserver" @@ -98,7 +97,7 @@ var startCmd = &cobra.Command{ logrus.Fatal(err) } - qkdnClient := etsiqkdnclient.NewQkdnClient(kmsConfig) + ekmsClient := etsiqkdnclient.NewEkmsClient(kmsConfig) schema, err := gnmitargetygot.Schema() if err != nil { @@ -114,8 +113,9 @@ var startCmd = &cobra.Command{ system.NewMotdHandler(), system.NewStateHandler(), system.NewSystemHandler(), - etsi.NewETSI15Handler(qkdnClient), - danet.NewAssignForwardingHandler(qkdnClient), + danet.NewKmsHandler(ekmsClient), + danet.NewPeerHandler(ekmsClient), + danet.NewAssignForwardingHandler(ekmsClient), } gnmitTarget := gnmitarget.NewGnmiTarget(schema, &gnmitargetygot.Gnmitarget{}, gnmitargetygot.ΓModelData, gnmitargetygot.Unmarshal, gnmitargetygot.ΛEnum, handlers...) diff --git a/config/ekms/example01.yaml b/config/ekms/example01.yaml index 8d73259fb558c7790d27c876889a43c5c42e29cb..fc89a1bd72862cfd2c8d0306aab9019d0093f64c 100644 --- a/config/ekms/example01.yaml +++ b/config/ekms/example01.yaml @@ -1,11 +1,13 @@ +Id: '0ff33c82-7fe1-482b-a0ca-67565806ee4b' Name: ekms01 InterComAddr: 172.100.20.10:50910 GRPCAddr: 172.100.20.10:50900 Peers: - # peer to ekms02 - - PeerInterComAddr: 172.100.20.11:50910 + # peer to ekms02 + - PeerId: '968fd594-b0e7-41f0-ba4b-de259047a933' + PeerInterComAddr: 172.100.20.11:50910 Sync: true # quantum module of type emulated at the given address QuantumModule: - Type: emulated - Address: 172.100.20.12 + Type: emulated + Address: 172.100.20.12 diff --git a/config/ekms/example02.yaml b/config/ekms/example02.yaml index f442f1e448fb70cb0161813c055116577772ad96..36aec3ddaf4953ecc800457794397db66321e3b0 100644 --- a/config/ekms/example02.yaml +++ b/config/ekms/example02.yaml @@ -1,11 +1,13 @@ +Id: '968fd594-b0e7-41f0-ba4b-de259047a933' Name: ekms02 InterComAddr: 172.100.20.11:50910 GRPCAddr: 172.100.20.11:50900 Peers: - # peer to ekms01 - - PeerInterComAddr: 172.100.20.10:50910 + # peer to ekms01 + - PeerId: '0ff33c82-7fe1-482b-a0ca-67565806ee4b' + PeerInterComAddr: 172.100.20.10:50910 Sync: false # quantum module of type emulated at the given address QuantumModule: - Type: emulated - Address: 172.100.20.13 + Type: emulated + Address: 172.100.20.13 diff --git a/docker-compose.yml b/docker-compose.yml index 0a601e32546322892eb23ef0296eef408e76812b..c85be767332b786a76cb509121299ce07c4d6caa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,7 @@ services: - ./config/ekms/example01.yaml:/tmp/kms/config/ekms01.yaml ports: - "127.0.0.1:50900:50900" + - "127.0.0.1:7030:7030" networks: ekms-net: ipv4_address: 172.100.20.10 @@ -21,6 +22,7 @@ services: - ./config/ekms/example02.yaml:/tmp/kms/config/ekms02.yaml ports: - "127.0.0.1:50901:50900" + - "127.0.0.1:7031:7030" networks: ekms-net: ipv4_address: 172.100.20.11 diff --git a/etsiqkdnclient/etsi-qkdn-client.go b/etsiqkdnclient/etsi-qkdn-client.go index 14ec0855cdb2a362fa25b54d5a3e161dcedfcaa4..43cd5238af67f51540336d28a5893748ca399413 100644 --- a/etsiqkdnclient/etsi-qkdn-client.go +++ b/etsiqkdnclient/etsi-qkdn-client.go @@ -43,6 +43,7 @@ const ( // GenerateKeys: true type Config struct { + Id string `yaml:"Id"` Name string `yaml:"Name"` InterComAddr string `yaml:"InterComAddr"` GRPCAddr string `yaml:"GRPCAddr"` @@ -62,44 +63,70 @@ type QuantumModule struct { MasterMode bool `yaml:"MasterMode"` } -type EtsiQkdClient interface { - GetQkdnVersion() *string - GetQkdnUui() *string - GetQkdnLocationId() *string - GetEKMS() *kms.EKMS - SubscribeToEtsiQkdClient() chan string +type EkmsClient interface { + Version() *ekmsVersionInformation + ID() uuid.UUID + Ekms() *kms.EKMS + Subscribe() chan string } +// TODO: change this in the future // This provides some static information -type etsiQkdnInfo struct { +type ekmsInfo struct { // Information used to fill the ETSI GS QKD 15 yang model - qkdnVersion string // qkdn_version - qkdnUuid string - qkdnLocationId string + id uuid.UUID + version *ekmsVersionInformation kms *kms.EKMS KmsPeerUpdateChannel chan string // used to get updates from KmsPeer part } +type ekmsVersionInformation struct { + firmware string + swVersion string + hwVersion string +} + +func (evi *ekmsVersionInformation) Firmware() string { + return evi.firmware +} + +func (evi *ekmsVersionInformation) SoftwareVersion() string { + return evi.swVersion +} + +func (evi *ekmsVersionInformation) HardwareVersion() string { + return evi.hwVersion +} + // A QkdnClient for the emulated KMS -// Creates two mockup QKD Interfaces for testing -func NewQkdnClient(bootInfo *Config) (myInfo *etsiQkdnInfo) { +func NewEkmsClient(bootInfo *Config) (myInfo *ekmsInfo) { + var ekmsId uuid.UUID + if bootInfo.Id != "" { + ekmsId = uuid.MustParse(bootInfo.Id) + } else { + ekmsId = uuid.New() + } + + myInfo = new(ekmsInfo) + myInfo.version = &ekmsVersionInformation{ + firmware: "danet-emulated-kms", + swVersion: "0.1.0", + hwVersion: "0.1.0", + } - myInfo = new(etsiQkdnInfo) - myInfo.qkdnVersion = "danet-emulated-kms;0.1.0" - myInfo.qkdnUuid = uuid.NewString() - myInfo.qkdnLocationId = "toujours et partout" + myInfo.id = ekmsId myInfo.KmsPeerUpdateChannel = make(chan string) log.Printf("%s in regular operations mode", bootInfo.Name) - myInfo.kms = emulatedKMS(bootInfo, myInfo.KmsPeerUpdateChannel) + myInfo.kms = emulatedKMS(bootInfo, ekmsId, myInfo.KmsPeerUpdateChannel) return myInfo } // TODO: return an error -func emulatedKMS(config *Config, peerChannel chan string) *kms.EKMS { +func emulatedKMS(config *Config, id uuid.UUID, peerChannel chan string) *kms.EKMS { // Attach to eKMS - emuKMS := kms.NewEKMS(config.Name, uuid.New(), os.Stdout, log.TraceLevel, false, config.InterComAddr) + emuKMS := kms.NewEKMS(config.Name, id, os.Stdout, log.TraceLevel, false, config.InterComAddr) emuKMS.AddExternalNotifierKMSPeer(peerChannel) var qm kms.QuantumModule @@ -146,22 +173,18 @@ func emulatedKMS(config *Config, peerChannel chan string) *kms.EKMS { return emuKMS } -func (qkdnInfo *etsiQkdnInfo) GetQkdnVersion() *string { - return &qkdnInfo.qkdnVersion -} - -func (qkdnInfo *etsiQkdnInfo) GetQkdnUui() *string { - return &qkdnInfo.qkdnUuid +func (qkdnInfo *ekmsInfo) Version() *ekmsVersionInformation { + return qkdnInfo.version } -func (qkdnInfo *etsiQkdnInfo) GetQkdnLocationId() *string { - return &qkdnInfo.qkdnLocationId +func (qkdnInfo *ekmsInfo) ID() uuid.UUID { + return qkdnInfo.id } -func (qkdnInfo *etsiQkdnInfo) GetEKMS() *kms.EKMS { +func (qkdnInfo *ekmsInfo) Ekms() *kms.EKMS { return qkdnInfo.kms } -func (qkdnInfo *etsiQkdnInfo) SubscribeToEtsiQkdClient() chan string { +func (qkdnInfo *ekmsInfo) Subscribe() chan string { return qkdnInfo.KmsPeerUpdateChannel } diff --git a/handlers/danet/assignForwardingHandler.go b/handlers/danet/assignForwardingHandler.go index 95baf83c3af89e526854b25d9ed35f412c9692ec..db2cba859c877425e741aa7e5aef55f5a76cece4 100644 --- a/handlers/danet/assignForwardingHandler.go +++ b/handlers/danet/assignForwardingHandler.go @@ -13,16 +13,16 @@ import ( type AssignForwardingHandler struct { name string paths map[string]struct{} - qkdnClient etsiqkdnclient.EtsiQkdClient + ekmsClient etsiqkdnclient.EkmsClient } -func NewAssignForwardingHandler(client etsiqkdnclient.EtsiQkdClient) *AssignForwardingHandler { +func NewAssignForwardingHandler(client etsiqkdnclient.EkmsClient) *AssignForwardingHandler { return &AssignForwardingHandler{ name: "assign-forwarding-handler", paths: map[string]struct{}{ "/assign-forwarding": struct{}{}, }, - qkdnClient: client, + ekmsClient: client, } } @@ -61,7 +61,7 @@ func (yh *AssignForwardingHandler) Update(c ygot.ValidatedGoStruct, jobs []*gnmi prevHopString = fmt.Sprintf("%s:%d", prevHop.GetIpAddress(), prevHop.GetPort()) } - if err := yh.qkdnClient.GetEKMS().AssignForwardingRoute(forwarding.GetPathId(), prevHopString, nextHopString); err != nil { + if err := yh.ekmsClient.Ekms().AssignForwardingRoute(forwarding.GetPathId(), prevHopString, nextHopString); err != nil { return err } diff --git a/handlers/danet/kmsHandler.go b/handlers/danet/kmsHandler.go new file mode 100644 index 0000000000000000000000000000000000000000..fb2c62df181465c8e93c04e35f9b43762f9f9aad --- /dev/null +++ b/handlers/danet/kmsHandler.go @@ -0,0 +1,71 @@ +package danet + +import ( + "fmt" + + "code.fbi.h-da.de/danet/ekms/etsiqkdnclient" + gnmitargetygot "code.fbi.h-da.de/danet/ekms/model" + "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/ygot/ygot" +) + +type KmsHandler struct { + name string + paths map[string]struct{} + ekmsClient etsiqkdnclient.EkmsClient +} + +func NewKmsHandler(client etsiqkdnclient.EkmsClient) *KmsHandler { + return &KmsHandler{ + name: "kms-handler", + paths: map[string]struct{}{ + "/kms": struct{}{}, + }, + ekmsClient: client, + } +} + +func (yh *KmsHandler) Name() string { + return yh.name +} + +func (yh *KmsHandler) Paths() map[string]struct{} { + return yh.paths +} + +func (yh *KmsHandler) Init(c ygot.ValidatedGoStruct) error { + config, ok := c.(*gnmitargetygot.Gnmitarget) + if !ok { + return fmt.Errorf("failed type assertion for newConfig %T", (*gnmitargetygot.Gnmitarget)(nil)) + } + + //Prepare the eKMS to send KMSPeer notifications + yh.ekmsClient.Ekms().AddExternalNotifierKMSPeer(yh.ekmsClient.Subscribe()) + + // Create ygot structs for the kms + confEkms := config.GetOrCreateKms() + + // Fill out the known fields in the ygot structs + err := updateOrCreateKMS(confEkms, yh.ekmsClient) + if err != nil { + return err + } + + return nil +} + +func (yh *KmsHandler) Update(c ygot.ValidatedGoStruct, jobs []*gnmi.Update) error { + // static information, therefore a update should not do anything + return nil +} + +func updateOrCreateKMS(confKMS *gnmitargetygot.Temp_Kms, ekmsClient etsiqkdnclient.EkmsClient) error { + confKMS.KmsId = ygot.String(ekmsClient.ID().String()) + + confVersionInfo := confKMS.GetOrCreateVersionInformation() + confVersionInfo.Firmware = ygot.String(ekmsClient.Version().Firmware()) + confVersionInfo.HwVersion = ygot.String(ekmsClient.Version().HardwareVersion()) + confVersionInfo.SwVersion = ygot.String(ekmsClient.Version().SoftwareVersion()) + + return nil +} diff --git a/handlers/danet/peerHandler.go b/handlers/danet/peerHandler.go new file mode 100644 index 0000000000000000000000000000000000000000..13d396c0a82c22cab7577b50beeeb8031964e02e --- /dev/null +++ b/handlers/danet/peerHandler.go @@ -0,0 +1,110 @@ +package danet + +import ( + "fmt" + + "code.fbi.h-da.de/danet/ekms/etsiqkdnclient" + "code.fbi.h-da.de/danet/ekms/internal/kms" + gnmitargetygot "code.fbi.h-da.de/danet/ekms/model" + "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/ygot/ygot" + log "github.com/sirupsen/logrus" +) + +type PeerHandler struct { + name string + paths map[string]struct{} + ekmsClient etsiqkdnclient.EkmsClient +} + +func NewPeerHandler(client etsiqkdnclient.EkmsClient) *PeerHandler { + return &PeerHandler{ + name: "kms-handler", + paths: map[string]struct{}{ + // TODO:change to right path + "kms-peers": struct{}{}, + }, + ekmsClient: client, + } +} + +func (yh *PeerHandler) Name() string { + return yh.name +} + +func (yh *PeerHandler) Paths() map[string]struct{} { + return yh.paths +} + +func (yh *PeerHandler) Init(c ygot.ValidatedGoStruct) error { + config, ok := c.(*gnmitargetygot.Gnmitarget) + if !ok { + return fmt.Errorf("failed type assertion for newConfig %T", (*gnmitargetygot.Gnmitarget)(nil)) + } + + //Prepare the eKMS to send KMSPeer notifications + yh.ekmsClient.Ekms().AddExternalNotifierKMSPeer(yh.ekmsClient.Subscribe()) + + // Create ygot structs for the kms + confPeerTable := config.GetOrCreateKmsPeerTable() + + // Fill out the known fields in the ygot structs + err := updateOrCreatePeerTable(confPeerTable, yh.ekmsClient) + if err != nil { + return err + } + + // Start the go routine that takes care of any update from the kms + go func() { + kmsChan := yh.ekmsClient.Subscribe() + for { + select { + case <-kmsChan: + log.Println("Update for KMSPeer.") + if err := updateOrCreatePeerTable(confPeerTable, yh.ekmsClient); err != nil { + log.Println("Error within kmspeer update goroutine.") + } + } + } + }() + + return nil +} + +func (yh *PeerHandler) Update(c ygot.ValidatedGoStruct, jobs []*gnmi.Update) error { + // TODO: implement + return nil +} + +func updateOrCreatePeerTable(confKMS *gnmitargetygot.Temp_KmsPeerTable, ekmsClient etsiqkdnclient.EkmsClient) error { + kmsPeers := ekmsClient.Ekms().PeersDeepCopy() + + for _, peer := range kmsPeers { + confTempKmsPeer := confKMS.GetOrCreateKmsPeers(peer.GetKmsPeerId().String()) + confTempPeerInformation := confTempKmsPeer.GetOrCreatePeerInformation() + + confTempPeerInformation.IpAddress = ygot.String(peer.Address().IP.String()) + confTempPeerInformation.Port = ygot.Uint16(uint16(peer.Address().Port)) + + // TODO: implement for kms, curently hardcoded + confInterKmsProtocol := confTempPeerInformation.GetOrCreateInterKmsProtocol() + confInterKmsProtocol.ProtocolName = gnmitargetygot.Temp_KmsInterfaceTable_KmsInterfaces_InterKmsProtocol_ProtocolName_DANET_INTER_KMS_PROTO + confInterKmsProtocol.OpStatus = gnmitargetygot.Temp_KmsInterfaceTable_KmsInterfaces_InterKmsProtocol_OpStatus_ALLOWED + + confTempPeerInformation.QkdModuleId = ygot.String(peer.QuantumModule().String()) + + switch status := peer.GetKmsPeerStatus(); status { + case kms.KmsPeerUp: + confTempPeerInformation.OpStatus = gnmitargetygot.Temp_KmsPeerTable_KmsPeers_PeerInformation_OpStatus_ACTIVE + case kms.KmsPeerPending: + confTempPeerInformation.OpStatus = gnmitargetygot.Temp_KmsPeerTable_KmsPeers_PeerInformation_OpStatus_PENDING + default: + confTempPeerInformation.OpStatus = gnmitargetygot.Temp_KmsPeerTable_KmsPeers_PeerInformation_OpStatus_ERROR + } + + // TODO: implement for kms, curently hardcoded + confTempPeerInformation.NegotiatedKeyLength = ygot.Uint64(256) + } + + return nil +} diff --git a/handlers/etsi/etsi15Handler.go b/handlers/etsi/etsi15Handler.go deleted file mode 100644 index 7d536c807cb9f73805eefcaa2d74fbcc8596d96f..0000000000000000000000000000000000000000 --- a/handlers/etsi/etsi15Handler.go +++ /dev/null @@ -1,190 +0,0 @@ -package etsi - -import ( - "fmt" - - "code.fbi.h-da.de/danet/ekms/etsiqkdnclient" - gnmitargetygot "code.fbi.h-da.de/danet/ekms/model" - "github.com/openconfig/gnmi/proto/gnmi" - "github.com/openconfig/ygot/ygot" - log "github.com/sirupsen/logrus" -) - -// ETSI15Handler is the implementation of a gnmitarget.PathHandler. -type ETSI15Handler struct { - name string - paths map[string]struct{} - qkdnClient etsiqkdnclient.EtsiQkdClient -} - -func NewETSI15Handler(client etsiqkdnclient.EtsiQkdClient) *ETSI15Handler { - return &ETSI15Handler{ - name: "etsi15-handler", - paths: map[string]struct{}{ - "/qkdn": struct{}{}, - }, - qkdnClient: client, - } -} - -func (yh *ETSI15Handler) Name() string { - return yh.name -} - -func (yh *ETSI15Handler) Paths() map[string]struct{} { - return yh.paths -} - -func (yh *ETSI15Handler) Init(c ygot.ValidatedGoStruct) error { - config, ok := c.(*gnmitargetygot.Gnmitarget) - if !ok { - return fmt.Errorf("failed type assertion for newConfig %T", (*gnmitargetygot.Gnmitarget)(nil)) - } - - //Prepare the KMS to send KMSPeer notifications - yh.qkdnClient.GetEKMS().AddExternalNotifierKMSPeer(yh.qkdnClient.SubscribeToEtsiQkdClient()) - - // Create ygot structs for the ETSI GS QKD 15 models - confQkdNode := config.GetOrCreateQkdNode() - - // Fill out the known fields in the ygot structs - err := updateOrCreateQkdNode(confQkdNode, yh.qkdnClient) - if err != nil { - return err - } - - // Start the go routine that takes care of any update from the kms - go func() { - kmsChan := yh.qkdnClient.SubscribeToEtsiQkdClient() - for { - select { - case <-kmsChan: - log.Println("Update for KMSPeer.") - if err := updateOrCreateQkdNode(confQkdNode, yh.qkdnClient); err != nil { - fmt.Println("Error within qkdn update goroutine.") - } - } - } - }() - - return nil -} - -func (yh *ETSI15Handler) Update(c ygot.ValidatedGoStruct, jobs []*gnmi.Update) error { - fmt.Println("Update request received for ", yh.name) - //config, ok := c.(*gnmitargetygot.Gnmitarget) - //if !ok { - // return fmt.Errorf("failed type assertion for newConfig %T", (*gnmitargetygot.Gnmitarget)(nil)) - //} - - //qkdnInfo := config.GetQkdNode() - - //if qkdnInfo != nil { - // // check for changes in the QKD interfaces - // if q := qkdnInfo.GetOrCreateQkdInterfaces(); q != nil { - // for _, qkdnIface := range q.QkdInterface { - // qle, exists := yh.qkdnClient.GetEKMS().QuantumElements[*qkdnIface.QkdiId] - // if !exists { - // log.Printf("Could not find QuantumElement with QKD-ID: %d\n", *qkdnIface.QkdiId) - // return fmt.Errorf("Error: Could not find QuantumElement with QKD-ID: %d\n", *qkdnIface.QkdiId) - // } - // if qkdnIface.QkdiStatus == gnmitargetygot.EtsiQkdSdnNode_IfaceStatusTypes_DISABLED { - // qle.QuantumElementLink.PowerOff() - // } else if qkdnIface.QkdiStatus == gnmitargetygot.EtsiQkdSdnNode_IfaceStatusTypes_ENABLED { - // qle.QuantumElementLink.PowerOn(true) - // } - // } - // } - // if links := qkdnInfo.GetOrCreateQkdLinks(); links != nil { - // theEKMS := yh.qkdnClient.GetEKMS() - // for _, qkdnLink := range links.QkdLink { - // peerUuid, uuidErr := uuid.Parse(*qkdnLink.QkdlId) - // if uuidErr != nil { - // return fmt.Errorf("Couldn't parse uuid %s of request", *qkdnLink.QkdlId) - // } - // // Lookup peer and skip if there - // // TODO needs handling for existing peers - // if thePeer := theEKMS.FindPeerUuid(peerUuid); thePeer == nil { - // // should be changed!!!! - // if qkdnLink.QkdlLocal.QkdiId != nil && qkdnLink.QkdlRemote.QkdiRemoteSocket != nil && qkdnLink.QkdlStatus == gnmitargetygot.EtsiQkdSdnNode_LinkStatusTypes_ACTIVE { - // if elementID, _ := theEKMS.QuantumElements[*qkdnLink.QkdlLocal.QkdiId]; elementID != nil { - // theEKMS.AddPeer(*qkdnLink.QkdlRemote.QkdiRemoteSocket, elementID) - // } - // } - // } - // if qkdnLink.QkdlLocal.QkdiId != nil && qkdnLink.QkdlRemote.QkdiRemoteSocket != nil && qkdnLink.QkdlStatus == gnmitargetygot.EtsiQkdSdnNode_LinkStatusTypes_PASSIVE { - // theEKMS.RemovePeer(*qkdnLink.QkdlRemote.QkdiRemoteSocket) - // } - // } - // } - //} - return nil -} - -func updateOrCreateQkdNode(confQkdNode *gnmitargetygot.EtsiQkdSdnNode_QkdNode, qkdInfo etsiqkdnclient.EtsiQkdClient) error { - // set current version of the QDKN module - confQkdNode.QkdnVersion = qkdInfo.GetQkdnVersion() - confQkdNode.QkdnId = qkdInfo.GetQkdnUui() - confQkdNode.QkdnLocationId = qkdInfo.GetQkdnLocationId() - /* - confQkdNode.QkdnCapabilities.ApplicationStatsSupport - confQkdNode.QkdnCapabilities.LinkStatsSupport - confQkdNode.QkdnCapabilities.KeyRelayModeEnable - */ - - // Fill QKD Interfaces with the relevant information - // Interfaces structure - confQkdNode.QkdInterfaces = confQkdNode.GetOrCreateQkdInterfaces() - //QkdiModel := "danet-emulated-qle-prng" - - //// range through existing QKD interfaces out of proto-kms - //myKMS := qkdInfo.GetEKMS() - //for _, element := range myKMS.QuantumElements { - // log.Printf("Element with ID %d\n", element.QlID) - - // //Check if element exists in ygot struct - // qkdIface, nodeErr := confQkdNode.QkdInterfaces.NewQkdInterface(element.QlID) - // if nodeErr != nil { - // qkdIface = confQkdNode.QkdInterfaces.GetQkdInterface(element.QlID) - // } else { - // confQkdNode.QkdInterfaces.AppendQkdInterface(qkdIface) - // } - - // qkdIface.QkdiId = &element.QlID - // if poweredOn, _ := element.QuantumElementLink.GetStatus(); poweredOn == true { - // qkdIface.QkdiStatus = gnmitargetygot.EtsiQkdSdnNode_IfaceStatusTypes_ENABLED - // } else { - // qkdIface.QkdiStatus = gnmitargetygot.EtsiQkdSdnNode_IfaceStatusTypes_DISABLED - // } - // qkdIface.QkdiModel = &QkdiModel - // //qkdIface.QkdiAttPoint.Device = - // element.QuantumElementLink.GetLocalQLPort() - //} - //confQkdNode.QkdLinks = confQkdNode.GetOrCreateQkdLinks() - - //// Check for changes in the QKD key association links - //if q := confQkdNode.GetOrCreateQkdLinks(); q != nil { - // for _, kmsLink := range qkdInfo.GetEKMS().KmsPeers { - // // Just write the current status of this kms peer - // qkdnLink := confQkdNode.QkdLinks.GetOrCreateQkdLink(kmsLink.GetKmsPeerId().String()) - // switch kmsLink.GetKmsPeerStatus() { - // case kms.KmsPeerDown: - // qkdnLink.QkdlStatus = gnmitargetygot.E_EtsiQkdSdnNode_LinkStatusTypes(gnmitargetygot.EtsiQkdSdnNode_LinkStatusTypes_OFF) - // case kms.KmsPeerUp: - // qkdnLink.QkdlStatus = gnmitargetygot.E_EtsiQkdSdnNode_LinkStatusTypes(gnmitargetygot.EtsiQkdSdnNode_LinkStatusTypes_ACTIVE) - // case kms.KmsPeerPending: - // qkdnLink.QkdlStatus = gnmitargetygot.E_EtsiQkdSdnNode_LinkStatusTypes(gnmitargetygot.EtsiQkdSdnNode_LinkStatusTypes_PENDING) - // default: - // qkdnLink.QkdlStatus = gnmitargetygot.E_EtsiQkdSdnNode_LinkStatusTypes(gnmitargetygot.EtsiQkdSdnNode_LinkStatusTypes_UNSET) - // } - // peerQkdiId := kmsLink.GetKmsPeerQkdiId() - // qkdLocal := qkdnLink.GetOrCreateQkdlLocal() - // qkdLocal.QkdiId = &peerQkdiId - // qkdnLink.QkdlLocal = qkdLocal - // } - //} - - confQkdNode.QkdApplications = confQkdNode.GetOrCreateQkdApplications() - - return nil -} diff --git a/internal/kms/kms.go b/internal/kms/kms.go index 37dc67f9dfab87fa81238e1c09820dc4fbc7c482..b63f2d47e77106471680e8575b112844f2157b18 100644 --- a/internal/kms/kms.go +++ b/internal/kms/kms.go @@ -236,3 +236,15 @@ func (kms *EKMS) FindPeerUuid(lookup uuid.UUID) (peer *kmsPeer) { return nil } + +func (kms *EKMS) PeersDeepCopy() map[string]*kmsPeer { + copy := make(map[string]*kmsPeer, len(kms.KmsPeers)) + + kms.kmsPeersMutex.Lock() + for k, v := range kms.KmsPeers { + copy[k] = v + } + kms.kmsPeersMutex.Unlock() + + return copy +} diff --git a/internal/kms/kmspeers.go b/internal/kms/kmspeers.go index f7a8d9daa22588bc92d5624f371b35e43f588769..ab2cec0c303d0d0bc460aa9bdd0e8cf07b6224b7 100644 --- a/internal/kms/kmspeers.go +++ b/internal/kms/kmspeers.go @@ -34,11 +34,11 @@ type kmsPeer struct { externalNotifierKMSPeer chan string peerClient pbIC.KmsTalkerClient peerStatus KmsPeerStatus - peerKmsId string // NOTE: might be changed in the future + peerKmsId uuid.UUID // NOTE: might be changed in the future interComAddr string servingQuantumModul QuantumModule - tcpSocket net.TCPAddr // the IP address and TCP port (aka socket) of the kms peer - tcpSocketStr string // string rep. of tcpSocket + tcpSocket *net.TCPAddr // the IP address and TCP port (aka socket) of the kms peer + tcpSocketStr string // string rep. of tcpSocket et CryptoAlgorithm name string // the name of the kms peer id uuid.UUID // uuid of the peer @@ -49,22 +49,34 @@ func NewKmsPeer(peerKmsId string, servQM QuantumModule, tcpSocketStr string, int if servQM.Peer() != nil { return nil, fmt.Errorf("QuantumModule with ID: , already has a peer", servQM.ID()) } + + peerKmsIdUUID, err := uuid.Parse(peerKmsId) + if err != nil { + return nil, err + } newPeerConn, err := grpc.Dial(tcpSocketStr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return nil, err } + peerClient := pbIC.NewKmsTalkerClient(newPeerConn) + tcpSocket, err := net.ResolveTCPAddr("tcp", tcpSocketStr) + if err != nil { + return nil, err + } + peer := &kmsPeer{ externalNotifierKMSPeer: in, // TODO: rename to client peerClient: peerClient, // TODO: change this, only for demo purposes peerStatus: KmsPeerUp, - peerKmsId: peerKmsId, + peerKmsId: peerKmsIdUUID, // TODO: move this into a config interComAddr: interComAddr, servingQuantumModul: servQM, + tcpSocket: tcpSocket, tcpSocketStr: tcpSocketStr, et: NewAES(), id: uuid.New(), @@ -80,6 +92,14 @@ func NewKmsPeer(peerKmsId string, servQM QuantumModule, tcpSocketStr string, int return peer, nil } +func (ph *kmsPeer) Address() *net.TCPAddr { + return ph.tcpSocket +} + +func (ph *kmsPeer) QuantumModule() uuid.UUID { + return ph.servingQuantumModul.ID() +} + func (ph *kmsPeer) SyncBulkKeys() error { return ph.servingQuantumModul.Sync() } @@ -157,5 +177,5 @@ func (ph *kmsPeer) GetKmsPeerStatus() KmsPeerStatus { } func (ph *kmsPeer) GetKmsPeerId() uuid.UUID { - return ph.id + return ph.peerKmsId }