swagger:operation GET /1.0/networks/{networkName}/forwards/{listenAddress} network-forwards network_forward_get Get the network address forward Gets a specific network address forward. --- produces: - application/json parameters: - in: path name: networkName description: Netw
(d *Daemon, r *http.Request)
| 497 | // "500": |
| 498 | // $ref: "#/responses/InternalServerError" |
| 499 | func networkForwardGet(d *Daemon, r *http.Request) response.Response { |
| 500 | s := d.State() |
| 501 | |
| 502 | resp := forwardedResponseIfTargetIsRemote(s, r) |
| 503 | if resp != nil { |
| 504 | return resp |
| 505 | } |
| 506 | |
| 507 | projectName, reqProject, err := project.NetworkProject(s.DB.Cluster, request.ProjectParam(r)) |
| 508 | if err != nil { |
| 509 | return response.SmartError(err) |
| 510 | } |
| 511 | |
| 512 | networkName, err := pathVar(r, "networkName") |
| 513 | if err != nil { |
| 514 | return response.SmartError(err) |
| 515 | } |
| 516 | |
| 517 | n, err := network.LoadByName(s, projectName, networkName) |
| 518 | if err != nil { |
| 519 | return response.SmartError(fmt.Errorf("Failed loading network: %w", err)) |
| 520 | } |
| 521 | |
| 522 | // Check if project allows access to network. |
| 523 | if !project.NetworkAllowed(reqProject.Config, networkName, n.IsManaged()) { |
| 524 | return response.SmartError(api.StatusErrorf(http.StatusNotFound, "Network not found")) |
| 525 | } |
| 526 | |
| 527 | if !n.Info().AddressForwards { |
| 528 | return response.BadRequest(fmt.Errorf("Network driver %q does not support forwards", n.Type())) |
| 529 | } |
| 530 | |
| 531 | listenAddress, err := pathVar(r, "listenAddress") |
| 532 | if err != nil { |
| 533 | return response.SmartError(err) |
| 534 | } |
| 535 | |
| 536 | targetMember := request.QueryParam(r, "target") |
| 537 | memberSpecific := targetMember != "" |
| 538 | |
| 539 | var forward *api.NetworkForward |
| 540 | |
| 541 | err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error { |
| 542 | networkID := n.ID() |
| 543 | dbRecords, err := dbCluster.GetNetworkForwards(ctx, tx.Tx(), dbCluster.NetworkForwardFilter{ |
| 544 | NetworkID: &networkID, |
| 545 | ListenAddress: &listenAddress, |
| 546 | }) |
| 547 | if err != nil { |
| 548 | return err |
| 549 | } |
| 550 | |
| 551 | filteredRecords := make([]dbCluster.NetworkForward, 0, len(dbRecords)) |
| 552 | for _, dbRecord := range dbRecords { |
| 553 | // Include all records if memberSpecific is turned off |
| 554 | // Otherwise, filter based offed of dbRecords with same node id |
| 555 | if !memberSpecific || (!dbRecord.NodeID.Valid || (dbRecord.NodeID.Int64 == tx.GetNodeID())) { |
| 556 | filteredRecords = append(filteredRecords, dbRecord) |
nothing calls this directly
no test coverage detected
searching dependent graphs…