Skip to content

Commit

Permalink
kube-ovn-controller 需要使用 sb nb client, 所以调整命名
Browse files Browse the repository at this point in the history
  • Loading branch information
zbb88888 committed Aug 7, 2023
1 parent fa26c69 commit 4571248
Show file tree
Hide file tree
Showing 23 changed files with 263 additions and 259 deletions.
18 changes: 11 additions & 7 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ type Controller struct {
namedPort *NamedPort

ovnLegacyClient *ovs.LegacyClient
ovnClient ovs.OvnClient

ovnNbClient ovs.OvnClient
ovnSbClient ovs.OvnClient

// ExternalGatewayType define external gateway type, centralized
ExternalGatewayType string
Expand Down Expand Up @@ -486,10 +488,12 @@ func Run(ctx context.Context, config *Configuration) {
}

var err error
if controller.ovnClient, err = ovs.NewOvnClient(config.OvnNbAddr, config.OvnTimeout, config.NodeSwitchCIDR); err != nil {
util.LogFatalAndExit(err, "failed to create ovn client")
if controller.ovnNbClient, err = ovs.NewOvnNbClient(config.OvnNbAddr, config.OvnTimeout, config.NodeSwitchCIDR); err != nil {
util.LogFatalAndExit(err, "failed to create ovn nb client")
}
if controller.ovnSbClient, err = ovs.NewOvnSbClient(config.OvnSbAddr, config.OvnTimeout, config.NodeSwitchCIDR); err != nil {
util.LogFatalAndExit(err, "failed to create ovn sb client")
}

if config.EnableLb {
controller.switchLBRuleLister = switchLBRuleInformer.Lister()
controller.switchLBRuleSynced = switchLBRuleInformer.Informer().HasSynced
Expand Down Expand Up @@ -766,11 +770,11 @@ func Run(ctx context.Context, config *Configuration) {
// is closed, at which point it will shutdown the workqueue and wait for
// workers to finish processing their current work items.
func (c *Controller) Run(ctx context.Context) {
if err := c.ovnClient.SetLsDnatModDlDst(c.config.LsDnatModDlDst); err != nil {
if err := c.ovnNbClient.SetLsDnatModDlDst(c.config.LsDnatModDlDst); err != nil {
util.LogFatalAndExit(err, "failed to set NB_Global option ls_dnat_mod_dl_dst")
}

if err := c.ovnClient.SetUseCtInvMatch(); err != nil {
if err := c.ovnNbClient.SetUseCtInvMatch(); err != nil {
util.LogFatalAndExit(err, "failed to set NB_Global option use_ct_inv_match to false")
}

Expand Down Expand Up @@ -1148,7 +1152,7 @@ func (c *Controller) startWorkers(ctx context.Context) {

func (c *Controller) allSubnetReady(subnets ...string) (bool, error) {
for _, lsName := range subnets {
exist, err := c.ovnClient.LogicalSwitchExists(lsName)
exist, err := c.ovnNbClient.LogicalSwitchExists(lsName)
if err != nil {
return false, fmt.Errorf("check logical switch %s exist: %v", lsName, err)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func newFakeController(t *testing.T) *fakeController {
vpcSynced: alwaysReady,
subnetsLister: sbunetInformer.Lister(),
subnetSynced: alwaysReady,
ovnClient: mockOvnClient,
ovnNbClient: mockOvnClient,
syncVirtualPortsQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), ""),
}

Expand Down
6 changes: 3 additions & 3 deletions pkg/controller/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,18 +197,18 @@ func (c *Controller) handleUpdateEndpoint(key string) error {
// for performance reason delete lb with no backends
if len(backends) != 0 {
klog.V(3).Infof("update vip %s with backends %s to LB %s", vip, backends, lb)
if err = c.ovnClient.LoadBalancerAddVip(lb, vip, backends...); err != nil {
if err = c.ovnNbClient.LoadBalancerAddVip(lb, vip, backends...); err != nil {
klog.Errorf("failed to add vip %s with backends %s to LB %s: %v", vip, backends, lb, err)
return err
}
} else {
klog.V(3).Infof("delete vip %s from LB %s", vip, lb)
if err := c.ovnClient.LoadBalancerDeleteVip(lb, vip); err != nil {
if err := c.ovnNbClient.LoadBalancerDeleteVip(lb, vip); err != nil {
klog.Errorf("failed to delete vip %s from LB %s: %v", vip, lb, err)
return err
}
klog.V(3).Infof("delete vip %s from old LB %s", vip, lb)
if err := c.ovnClient.LoadBalancerDeleteVip(oldLb, vip); err != nil {
if err := c.ovnNbClient.LoadBalancerDeleteVip(oldLb, vip); err != nil {
klog.Errorf("failed to delete vip %s from LB %s: %v", vip, lb, err)
return err
}
Expand Down
8 changes: 4 additions & 4 deletions pkg/controller/external-gw.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,15 @@ func (c *Controller) removeExternalGateway() error {

if !keepExternalSubnet {
klog.Infof("delete external gateway switch %s", c.config.ExternalGatewaySwitch)
if err := c.ovnClient.DeleteLogicalGatewaySwitch(util.ExternalGatewaySwitch, c.config.ClusterRouter); err != nil {
if err := c.ovnNbClient.DeleteLogicalGatewaySwitch(util.ExternalGatewaySwitch, c.config.ClusterRouter); err != nil {
klog.Errorf("delete external gateway switch %s: %v", util.ExternalGatewaySwitch, err)
return err
}
} else {
klog.Infof("should keep provider network vlan underlay external gateway switch %s", c.config.ExternalGatewaySwitch)
lrpName := fmt.Sprintf("%s-%s", c.config.ClusterRouter, c.config.ExternalGatewaySwitch)
klog.Infof("delete logical router port %s", lrpName)
if err := c.ovnClient.DeleteLogicalRouterPort(lrpName); err != nil {
if err := c.ovnNbClient.DeleteLogicalRouterPort(lrpName); err != nil {
klog.Errorf("failed to delete lrp %s, %v", lrpName, err)
return err
}
Expand All @@ -142,7 +142,7 @@ func (c *Controller) establishExternalGateway(config map[string]string) error {
}
var lrpIp, lrpMac string
lrpName := fmt.Sprintf("%s-%s", c.config.ClusterRouter, c.config.ExternalGatewaySwitch)
lrp, err := c.ovnClient.GetLogicalRouterPort(lrpName, true)
lrp, err := c.ovnNbClient.GetLogicalRouterPort(lrpName, true)
if err != nil {
klog.Errorf("failed to get lrp %s, %v", lrpName, err)
return err
Expand All @@ -160,7 +160,7 @@ func (c *Controller) establishExternalGateway(config map[string]string) error {
lrpIp = config["nic-ip"]
lrpMac = config["nic-mac"]
}
if err := c.ovnClient.CreateGatewayLogicalSwitch(c.config.ExternalGatewaySwitch, c.config.ClusterRouter, c.config.ExternalGatewayNet, lrpIp, lrpMac, c.config.ExternalGatewayVlanID, chassises...); err != nil {
if err := c.ovnNbClient.CreateGatewayLogicalSwitch(c.config.ExternalGatewaySwitch, c.config.ClusterRouter, c.config.ExternalGatewayNet, lrpIp, lrpMac, c.config.ExternalGatewayVlanID, chassises...); err != nil {
klog.Errorf("create external gateway switch %s: %v", c.config.ExternalGatewaySwitch, err)
return err
}
Expand Down
8 changes: 4 additions & 4 deletions pkg/controller/external_vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func (c *Controller) syncExternalVpc() {

func (c *Controller) getRouterStatus() (logicalRouters map[string]util.LogicalRouter, err error) {
logicalRouters = make(map[string]util.LogicalRouter)
externalOvnRouters, err := c.ovnClient.ListLogicalRouter(false, func(lr *ovnnb.LogicalRouter) bool {
externalOvnRouters, err := c.ovnNbClient.ListLogicalRouter(false, func(lr *ovnnb.LogicalRouter) bool {
return len(lr.ExternalIDs) == 0 || lr.ExternalIDs["vendor"] != util.CniTypeName
})
if err != nil {
Expand All @@ -101,7 +101,7 @@ func (c *Controller) getRouterStatus() (logicalRouters map[string]util.LogicalRo
Ports: make([]util.Port, 0, len(externalLR.Ports)),
}
for _, uuid := range externalLR.Ports {
lrp, err := c.ovnClient.GetLogicalRouterPortByUUID(uuid)
lrp, err := c.ovnNbClient.GetLogicalRouterPortByUUID(uuid)
if err != nil {
klog.Warningf("failed to get LRP by UUID %s: %v", uuid, err)
continue
Expand All @@ -113,7 +113,7 @@ func (c *Controller) getRouterStatus() (logicalRouters map[string]util.LogicalRo
for routerName, logicalRouter := range logicalRouters {
tmpRouter := logicalRouter
for _, port := range logicalRouter.Ports {
peerPorts, err := c.ovnClient.ListLogicalSwitchPorts(false, nil, func(lsp *ovnnb.LogicalSwitchPort) bool {
peerPorts, err := c.ovnNbClient.ListLogicalSwitchPorts(false, nil, func(lsp *ovnnb.LogicalSwitchPort) bool {
return len(lsp.Options) != 0 && lsp.Options["router-port"] == port.Name
})
if err != nil || len(peerPorts) > 1 {
Expand All @@ -124,7 +124,7 @@ func (c *Controller) getRouterStatus() (logicalRouters map[string]util.LogicalRo
continue
}
lsp := peerPorts[0]
switches, err := c.ovnClient.ListLogicalSwitch(false, func(ls *ovnnb.LogicalSwitch) bool {
switches, err := c.ovnNbClient.ListLogicalSwitch(false, func(ls *ovnnb.LogicalSwitch) bool {
return util.ContainsString(ls.Ports, lsp.UUID)
})
if err != nil || len(switches) > 1 {
Expand Down
32 changes: 16 additions & 16 deletions pkg/controller/gc.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func (c *Controller) gcLogicalRouterPort() error {
}
}

if err = c.ovnClient.DeleteLogicalRouterPorts(nil, logicalRouterPortFilter(exceptPeerPorts)); err != nil {
if err = c.ovnNbClient.DeleteLogicalRouterPorts(nil, logicalRouterPortFilter(exceptPeerPorts)); err != nil {
klog.Errorf("delete non-existent peer logical router port: %v", err)
return err
}
Expand Down Expand Up @@ -126,7 +126,7 @@ func (c *Controller) gcLogicalSwitch() error {
subnetNames.Add(s.Name)
}

lss, err := c.ovnClient.ListLogicalSwitch(c.config.EnableExternalVpc, nil)
lss, err := c.ovnNbClient.ListLogicalSwitch(c.config.EnableExternalVpc, nil)
if err != nil {
klog.Errorf("list logical switch: %v", err)
return err
Expand All @@ -152,7 +152,7 @@ func (c *Controller) gcLogicalSwitch() error {
}

klog.Infof("start to gc dhcp options")
dhcpOptions, err := c.ovnClient.ListDHCPOptions(c.config.EnableExternalVpc, nil)
dhcpOptions, err := c.ovnNbClient.ListDHCPOptions(c.config.EnableExternalVpc, nil)
if err != nil {
klog.Errorf("failed to list dhcp options, %v", err)
return err
Expand All @@ -165,7 +165,7 @@ func (c *Controller) gcLogicalSwitch() error {
}
klog.Infof("gc dhcp options %v", uuidToDeleteList)
if len(uuidToDeleteList) > 0 {
if err = c.ovnClient.DeleteDHCPOptionsByUUIDs(uuidToDeleteList...); err != nil {
if err = c.ovnNbClient.DeleteDHCPOptionsByUUIDs(uuidToDeleteList...); err != nil {
klog.Errorf("failed to delete dhcp options by uuids, %v", err)
return err
}
Expand All @@ -185,7 +185,7 @@ func (c *Controller) gcCustomLogicalRouter() error {
vpcNames = append(vpcNames, s.Name)
}

lrs, err := c.ovnClient.ListLogicalRouter(c.config.EnableExternalVpc, nil)
lrs, err := c.ovnNbClient.ListLogicalRouter(c.config.EnableExternalVpc, nil)
if err != nil {
klog.Errorf("failed to list logical router, %v", err)
return err
Expand Down Expand Up @@ -337,7 +337,7 @@ func (c *Controller) markAndCleanLSP() error {
// The lsp for vm pod should not be deleted if vm still exists
ipMap.Add(c.getVmLsps()...)

lsps, err := c.ovnClient.ListNormalLogicalSwitchPorts(c.config.EnableExternalVpc, nil)
lsps, err := c.ovnNbClient.ListNormalLogicalSwitchPorts(c.config.EnableExternalVpc, nil)
if err != nil {
klog.Errorf("failed to list logical switch port, %v", err)
return err
Expand All @@ -361,7 +361,7 @@ func (c *Controller) markAndCleanLSP() error {
}

klog.Infof("gc logical switch port %s", lsp.Name)
if err := c.ovnClient.DeleteLogicalSwitchPort(lsp.Name); err != nil {
if err := c.ovnNbClient.DeleteLogicalSwitchPort(lsp.Name); err != nil {
klog.Errorf("failed to delete lsp %s: %v", lsp.Name, err)
return err
}
Expand Down Expand Up @@ -414,7 +414,7 @@ func (c *Controller) gcLoadBalancer() error {
}

lbs := []string{vpc.Status.TcpLoadBalancer, vpc.Status.TcpSessionLoadBalancer, vpc.Status.UdpLoadBalancer, vpc.Status.UdpSessionLoadBalancer, vpc.Status.SctpLoadBalancer, vpc.Status.SctpSessionLoadBalancer}
if err := c.ovnClient.LogicalSwitchUpdateLoadBalancers(subnetName, ovsdb.MutateOperationDelete, lbs...); err != nil {
if err := c.ovnNbClient.LogicalSwitchUpdateLoadBalancers(subnetName, ovsdb.MutateOperationDelete, lbs...); err != nil {
return err
}
}
Expand All @@ -438,7 +438,7 @@ func (c *Controller) gcLoadBalancer() error {
}

// lbs will remove from logical switch automatically when delete lbs
if err = c.ovnClient.DeleteLoadBalancers(nil); err != nil {
if err = c.ovnNbClient.DeleteLoadBalancers(nil); err != nil {
klog.Errorf("delete all load balancers: %v", err)
return err
}
Expand Down Expand Up @@ -505,7 +505,7 @@ func (c *Controller) gcLoadBalancer() error {
return nil
}

lb, err := c.ovnClient.GetLoadBalancer(lbName, true)
lb, err := c.ovnNbClient.GetLoadBalancer(lbName, true)
if err != nil {
klog.Errorf("get LB %s: %v", lbName, err)
return err
Expand All @@ -517,7 +517,7 @@ func (c *Controller) gcLoadBalancer() error {

for vip := range lb.Vips {
if !svcVips.Has(vip) {
if err = c.ovnClient.LoadBalancerDeleteVip(lbName, vip); err != nil {
if err = c.ovnNbClient.LoadBalancerDeleteVip(lbName, vip); err != nil {
klog.Errorf("failed to delete vip %s from LB %s: %v", vip, lbName, err)
return err
}
Expand Down Expand Up @@ -547,7 +547,7 @@ func (c *Controller) gcLoadBalancer() error {
}

// delete lbs
if err = c.ovnClient.DeleteLoadBalancers(func(lb *ovnnb.LoadBalancer) bool {
if err = c.ovnNbClient.DeleteLoadBalancers(func(lb *ovnnb.LoadBalancer) bool {
return !util.ContainsString(vpcLbs, lb.Name)
}); err != nil {
klog.Errorf("delete load balancers: %v", err)
Expand Down Expand Up @@ -601,7 +601,7 @@ func (c *Controller) gcPortGroup() error {
}

// list all np port groups which externalIDs[np]!=""
pgs, err := c.ovnClient.ListPortGroups(map[string]string{networkPolicyKey: ""})
pgs, err := c.ovnNbClient.ListPortGroups(map[string]string{networkPolicyKey: ""})
if err != nil {
klog.Errorf("list np port group: %v", err)
return err
Expand All @@ -625,7 +625,7 @@ func (c *Controller) gcPortGroup() error {

func (c *Controller) gcStaticRoute() error {
klog.Infof("start to gc static routes")
routes, err := c.ovnClient.ListLogicalRouterStaticRoutes(c.config.ClusterRouter, nil, nil, "", nil)
routes, err := c.ovnNbClient.ListLogicalRouterStaticRoutes(c.config.ClusterRouter, nil, nil, "", nil)
if err != nil {
klog.Errorf("failed to list static route %v", err)
return err
Expand All @@ -648,7 +648,7 @@ func (c *Controller) gcStaticRoute() error {
continue
}
if route.IPPrefix != "0.0.0.0/0" && route.IPPrefix != "::/0" && c.ipam.ContainAddress(route.IPPrefix) {
exist, err := c.ovnClient.NatExists(c.config.ClusterRouter, "", "", route.IPPrefix)
exist, err := c.ovnNbClient.NatExists(c.config.ClusterRouter, "", "", route.IPPrefix)
if err != nil {
klog.Errorf("failed to get NatRule by LogicalIP %s, %v", route.IPPrefix, err)
continue
Expand All @@ -657,7 +657,7 @@ func (c *Controller) gcStaticRoute() error {
continue
}
klog.Infof("gc static route %s %v %s %s", route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop)
if err = c.ovnClient.DeleteLogicalRouterStaticRoute(c.config.ClusterRouter, &route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop); err != nil {
if err = c.ovnNbClient.DeleteLogicalRouterStaticRoute(c.config.ClusterRouter, &route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop); err != nil {
klog.Errorf("failed to delete stale route %s %v %s %s: %v", route.RouteTable, route.Policy, route.IPPrefix, route.Nexthop, err)
}
}
Expand Down
22 changes: 11 additions & 11 deletions pkg/controller/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func (c *Controller) InitOVN() error {
}
v4Svc, _ := util.SplitStringIP(c.config.ServiceClusterIPRange)
if v4Svc != "" {
if err := c.ovnClient.SetLBCIDR(v4Svc); err != nil {
if err := c.ovnNbClient.SetLBCIDR(v4Svc); err != nil {
klog.Errorf("init load balancer svc cidr failed: %v", err)
return err
}
Expand Down Expand Up @@ -200,7 +200,7 @@ func (c *Controller) initNodeSwitch() error {

// InitClusterRouter init cluster router to connect different logical switches
func (c *Controller) initClusterRouter() error {
return c.ovnClient.CreateLogicalRouter(c.config.ClusterRouter)
return c.ovnNbClient.CreateLogicalRouter(c.config.ClusterRouter)
}

func (c *Controller) initLB(name, protocol string, sessionAffinity bool) error {
Expand All @@ -211,13 +211,13 @@ func (c *Controller) initLB(name, protocol string, sessionAffinity bool) error {
selectFields = string(ovnnb.LoadBalancerSelectionFieldsIPSrc)
}

if err := c.ovnClient.CreateLoadBalancer(name, protocol, selectFields); err != nil {
if err := c.ovnNbClient.CreateLoadBalancer(name, protocol, selectFields); err != nil {
klog.Errorf("create load balancer %s: %v", name, err)
return err
}

if sessionAffinity {
if err := c.ovnClient.SetLoadBalancerAffinityTimeout(name, util.DefaultServiceSessionStickinessTimeout); err != nil {
if err := c.ovnNbClient.SetLoadBalancerAffinityTimeout(name, util.DefaultServiceSessionStickinessTimeout); err != nil {
klog.Errorf("failed to set affinity timeout of %s load balancer %s: %v", protocol, name, err)
return err
}
Expand Down Expand Up @@ -308,7 +308,7 @@ func (c *Controller) InitIPAM() error {
}
}

lsList, err := c.ovnClient.ListLogicalSwitch(false, nil)
lsList, err := c.ovnNbClient.ListLogicalSwitch(false, nil)
if err != nil {
klog.Errorf("failed to list LS: %v", err)
return err
Expand All @@ -318,7 +318,7 @@ func (c *Controller) InitIPAM() error {
lsPortsMap[ls.Name] = strset.New(ls.Ports...)
}

lspList, err := c.ovnClient.ListLogicalSwitchPortsWithLegacyExternalIDs()
lspList, err := c.ovnNbClient.ListLogicalSwitchPortsWithLegacyExternalIDs()
if err != nil {
klog.Errorf("failed to list LSP: %v", err)
return err
Expand Down Expand Up @@ -787,26 +787,26 @@ func (c *Controller) migrateNodeRoute(af int, node, ip, nexthop string) error {
}
klog.V(3).Infof("add policy route for router: %s, priority: %d, match %s, action %s, nexthop %s, extrenalID %v",
c.config.ClusterRouter, util.NodeRouterPolicyPriority, match, action, nexthop, externalIDs)
if err := c.ovnClient.AddLogicalRouterPolicy(c.config.ClusterRouter, util.NodeRouterPolicyPriority, match, action, []string{nexthop}, externalIDs); err != nil {
if err := c.ovnNbClient.AddLogicalRouterPolicy(c.config.ClusterRouter, util.NodeRouterPolicyPriority, match, action, []string{nexthop}, externalIDs); err != nil {
klog.Errorf("failed to add logical router policy for node %s: %v", node, err)
return err
}

routeTable := util.MainRouteTable
if err := c.ovnClient.DeleteLogicalRouterStaticRoute(c.config.ClusterRouter, &routeTable, nil, ip, ""); err != nil {
if err := c.ovnNbClient.DeleteLogicalRouterStaticRoute(c.config.ClusterRouter, &routeTable, nil, ip, ""); err != nil {
klog.Errorf("failed to delete obsolete static route for node %s: %v", node, err)
return err
}

asName := nodeUnderlayAddressSetName(node, af)
obsoleteMatch := fmt.Sprintf("ip%d.dst == %s && ip%d.src != $%s", af, ip, af, asName)
klog.V(3).Infof("delete policy route for router: %s, priority: %d, match %s", c.config.ClusterRouter, util.NodeRouterPolicyPriority, obsoleteMatch)
if err := c.ovnClient.DeleteLogicalRouterPolicy(c.config.ClusterRouter, util.NodeRouterPolicyPriority, obsoleteMatch); err != nil {
if err := c.ovnNbClient.DeleteLogicalRouterPolicy(c.config.ClusterRouter, util.NodeRouterPolicyPriority, obsoleteMatch); err != nil {
klog.Errorf("failed to delete obsolete logical router policy for node %s: %v", node, err)
return err
}

if err := c.ovnClient.DeleteAddressSet(asName); err != nil {
if err := c.ovnNbClient.DeleteAddressSet(asName); err != nil {
klog.Errorf("delete obsolete address set %s for node %s: %v", asName, node, err)
return err
}
Expand Down Expand Up @@ -842,7 +842,7 @@ func (c *Controller) initNodeRoutes() error {
}

func (c *Controller) initAppendLspExternalIds(portName string, externalIDs map[string]string) error {
if err := c.ovnClient.SetLogicalSwitchPortExternalIds(portName, externalIDs); err != nil {
if err := c.ovnNbClient.SetLogicalSwitchPortExternalIds(portName, externalIDs); err != nil {
klog.Errorf("set lsp external_ids for logical switch port %s: %v", portName, err)
return err
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/inspection.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func (c *Controller) inspectPod() error {
for _, podNet := range filterSubnets(pod, podNets) {
if podNet.Type != providerTypeIPAM {
portName := ovs.PodNameToPortName(podName, pod.Namespace, podNet.ProviderName)
exists, err := c.ovnClient.LogicalSwitchPortExists(portName)
exists, err := c.ovnNbClient.LogicalSwitchPortExists(portName)
if err != nil {
klog.Errorf("failed to check port %s exists, %v", portName, err)
return err
Expand Down
Loading

0 comments on commit 4571248

Please sign in to comment.