{"id":22499749,"url":"https://github.com/opiproject/opi-marvell-bridge","last_synced_at":"2025-08-03T06:32:23.086Z","repository":{"id":63260587,"uuid":"555108508","full_name":"opiproject/opi-marvell-bridge","owner":"opiproject","description":"OPI gRPC to Marvell bridge third party repo","archived":false,"fork":false,"pushed_at":"2024-06-13T21:53:30.000Z","size":1256,"stargazers_count":2,"open_issues_count":9,"forks_count":7,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-06-20T19:25:23.612Z","etag":null,"topics":["bridge","dpu","grpc","inventory","ipsec","marvell","opi","spdk","storage"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opiproject.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-21T00:53:25.000Z","updated_at":"2024-06-13T21:51:36.000Z","dependencies_parsed_at":"2023-10-28T01:31:16.675Z","dependency_job_id":"45f54378-8de3-43a6-a13d-6fa576521070","html_url":"https://github.com/opiproject/opi-marvell-bridge","commit_stats":{"total_commits":240,"total_committers":6,"mean_commits":40.0,"dds":"0.44999999999999996","last_synced_commit":"56d1e3f334dc0911127cfd51dcdc57f89477ba80"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opiproject%2Fopi-marvell-bridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opiproject%2Fopi-marvell-bridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opiproject%2Fopi-marvell-bridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opiproject%2Fopi-marvell-bridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opiproject","download_url":"https://codeload.github.com/opiproject/opi-marvell-bridge/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228532176,"owners_count":17933247,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bridge","dpu","grpc","inventory","ipsec","marvell","opi","spdk","storage"],"created_at":"2024-12-06T22:15:44.006Z","updated_at":"2024-12-06T22:15:45.041Z","avatar_url":"https://github.com/opiproject.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OPI gRPC to Marvell SDK bridge third party repo\n\n[![Linters](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/linters.yml/badge.svg)](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/linters.yml)\n[![CodeQL](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/codeql.yml/badge.svg)](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/codeql.yml)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/opiproject/opi-marvell-bridge/badge)](https://securityscorecards.dev/viewer/?platform=github.com\u0026org=opiproject\u0026repo=opi-marvell-bridge)\n[![tests](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/go.yml/badge.svg)](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/go.yml)\n[![Docker](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/opiproject/opi-marvell-bridge/actions/workflows/docker-publish.yml)\n[![License](https://img.shields.io/github/license/opiproject/opi-marvell-bridge?style=flat-square\u0026color=blue\u0026label=License)](https://github.com/opiproject/opi-marvell-bridge/blob/master/LICENSE)\n[![codecov](https://codecov.io/gh/opiproject/opi-marvell-bridge/branch/main/graph/badge.svg)](https://codecov.io/gh/opiproject/opi-marvell-bridge)\n[![Go Report Card](https://goreportcard.com/badge/github.com/opiproject/opi-marvell-bridge)](https://goreportcard.com/report/github.com/opiproject/opi-marvell-bridge)\n[![Go Doc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/opiproject/opi-marvell-bridge)\n[![Pulls](https://img.shields.io/docker/pulls/opiproject/opi-marvell-bridge.svg?logo=docker\u0026style=flat\u0026label=Pulls)](https://hub.docker.com/r/opiproject/opi-marvell-bridge)\n[![Last Release](https://img.shields.io/github/v/release/opiproject/opi-marvell-bridge?label=Latest\u0026style=flat-square\u0026logo=go)](https://github.com/opiproject/opi-marvell-bridge/releases)\n[![GitHub stars](https://img.shields.io/github/stars/opiproject/opi-marvell-bridge.svg?style=flat-square\u0026label=github%20stars)](https://github.com/opiproject/opi-marvell-bridge)\n[![GitHub Contributors](https://img.shields.io/github/contributors/opiproject/opi-marvell-bridge.svg?style=flat-square)](https://github.com/opiproject/opi-marvell-bridge/graphs/contributors)\n\nThis is a Marvell app (bridge) to OPI APIs for storage, inventory, ipsec and networking (future).\n\n## I Want To Contribute\n\nThis project welcomes contributions and suggestions.  We are happy to have the Community involved via submission of **Issues and Pull Requests** (with substantive content or even just fixes). We are hoping for the documents, test framework, etc. to become a community process with active engagement.  PRs can be reviewed by by any number of people, and a maintainer may accept.\n\nSee [CONTRIBUTING](https://github.com/opiproject/opi/blob/main/CONTRIBUTING.md) and [GitHub Basic Process](https://github.com/opiproject/opi/blob/main/doc-github-rules.md) for more details.\n\n## Getting started\n\nbuild like this:\n\n```bash\ngo build -v -o /opi-marvell-bridge ./cmd/...\n```\n\nimport like this:\n\n```go\nimport \"github.com/opiproject/opi-marvell-bridge/pkg/frontend\"\n```\n\n## Using docker\n\nBefore initiating the bridge, the [Redis](https://redis.io/) and [Jaeger](https://www.jaegertracing.io/) services must be operational. To specify non-standard ports for these services, use the `--help` command with the binary to find out which parameters needs to be passed.\n\non DPU/IPU (i.e. with IP=10.10.10.1) run\n\n```bash\n$ docker run --rm -it -v /var/tmp/:/var/tmp/ -p 50051:50051 ghcr.io/opiproject/opi-marvell-bridge:main\n2023/09/12 20:29:05 Connection to SPDK will be via: unix detected from /var/tmp/spdk.sock\n2023/09/12 20:29:05 gRPC server listening at [::]:50051\n2023/09/12 20:29:05 HTTP Server listening at 8082\n```\n\non X86 management VM run\n\nreflection\n\n```bash\n$ docker run --network=host --rm -it namely/grpc-cli ls --json_input --json_output localhost:50051\ngrpc.reflection.v1alpha.ServerReflection\nopi_api.inventory.v1.InventorySvc\nopi_api.security.v1.IPsec\nopi_api.storage.v1.AioVolumeService\nopi_api.storage.v1.FrontendNvmeService\nopi_api.storage.v1.FrontendVirtioBlkService\nopi_api.storage.v1.FrontendVirtioScsiService\nopi_api.storage.v1.MiddleendService\nopi_api.storage.v1.NvmeRemoteControllerService\nopi_api.storage.v1.NullVolumeService\n```\n\nfull test suite\n\n```bash\ndocker run --rm -it --network=host docker.io/opiproject/godpu:main inventory get --addr=\"10.10.10.10:50051\"\ndocker run --rm -it --network=host docker.io/opiproject/godpu:main storage test --addr=\"10.10.10.10:50051\"\ndocker run --rm -it --network=host docker.io/opiproject/godpu:main ipsec test --addr=10.10.10.10:50151 --pingaddr=8.8.8.1\"\n```\n\nrun either gRPC or HTTP requests\n\n```bash\n# gRPC requests\ndocker run --network=host --rm -it namely/grpc-cli ls   --json_input --json_output 10.10.10.10:50051 -l\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 CreateNvmeSubsystem \"{nvme_subsystem : {spec : {nqn: 'nqn.2022-09.io.spdk:opitest2', serial_number: 'myserial2', model_number: 'mymodel2', max_namespaces: 11} }, nvme_subsystem_id : 'subsystem2' }\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 ListNvmeSubsystems \"{}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 GetNvmeSubsystem \"{name : 'nvmeSubsystems/subsystem2'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 CreateNvmeController \"{parent: 'nvmeSubsystems/subsystem2', nvme_controller : {spec : {nvme_controller_id: 2, pcie_id : {physical_function : 0, virtual_function : 0, port_id: 0}, max_nsq:5, max_ncq:5, 'trtype': 'NVME_TRANSPORT_TYPE_PCIE' } }, nvme_controller_id : 'controller1'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 ListNvmeControllers \"{parent : 'nvmeSubsystems/subsystem2'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 GetNvmeController \"{name : 'nvmeSubsystems/subsystem2/nvmeControllers/controller1'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 CreateNvmeNamespace \"{parent: 'nvmeSubsystems/subsystem2', nvme_namespace : {spec : {volume_name_ref : 'Malloc0', 'host_nsid' : '10', uuid:{value : '1b4e28ba-2fa1-11d2-883f-b9a761bde3fb'}, nguid: '1b4e28ba-2fa1-11d2-883f-b9a761bde3fb', eui64: 1967554867335598546 } }, nvme_namespace_id: 'namespace1'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 ListNvmeNamespaces \"{parent : 'nvmeSubsystems/subsystem2'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 GetNvmeNamespace \"{name : 'nvmeSubsystems/subsystem2/nvmeNamespaces/namespace1'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 StatsNvmeNamespace \"{name : 'nvmeSubsystems/subsystem2/nvmeNamespaces/namespace1'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 CreateNvmeRemoteController \"{nvme_remote_controller : {multipath: 'NVME_MULTIPATH_MULTIPATH'}, nvme_remote_controller_id: 'nvmetcp12'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 ListNvmeRemoteControllers \"{}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 GetNvmeRemoteController \"{name: 'nvmeRemoteControllers/nvmetcp12'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 CreateNvmePath \"{parent: 'nvmeRemoteControllers/nvmetcp12', nvme_path : {traddr:'11.11.11.2', trtype:'NVME_TRANSPORT_TYPE_TCP', fabrics:{subnqn:'nqn.2016-06.com.opi.spdk.target0', trsvcid:'4444', adrfam:'NVME_ADDRESS_FAMILY_IPV4', hostnqn:'nqn.2014-08.org.nvmexpress:uuid:feb98abe-d51f-40c8-b348-2753f3571d3c'}}, nvme_path_id: 'nvmetcp12path0'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 CreateNvmeRemoteController \"{nvme_remote_controller : {multipath: 'NVME_MULTIPATH_DISABLE'}, nvme_remote_controller_id: 'nvmepcie13'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 CreateNvmePath \"{parent: 'nvmeRemoteControllers/nvmepcie13', nvme_path : {traddr:'0000:01:00.0', trtype:'NVME_TRANSPORT_TYPE_PCIE'}, nvme_path_id: 'nvmepcie13path0'}\"\n\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 ListNvmePaths \"{parent : 'nvmeRemoteControllers/nvmepcie13'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 DeleteNvmePath \"{name: 'nvmeRemoteControllers/nvmepcie13/nvmePaths/nvmepcie13path0'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 DeleteNvmeRemoteController \"{name: 'nvmeRemoteControllers/nvmepcie13'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 GetNvmePath \"{name: 'nvmeRemoteControllers/nvmetcp12/nvmePaths/nvmetcp12path0'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 DeleteNvmePath \"{name: 'nvmeRemoteControllers/nvmetcp12/nvmePaths/nvmetcp12path0'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 DeleteNvmeRemoteController \"{name: 'nvmeRemoteControllers/nvmetcp12'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 DeleteNvmeNamespace \"{name : 'nvmeSubsystems/subsystem2/nvmeNamespaces/namespace1'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 DeleteNvmeController \"{name : 'nvmeSubsystems/subsystem2/nvmeControllers/controller1'}\"\ndocker run --network=host --rm -it namely/grpc-cli call --json_input --json_output 10.10.10.10:50051 DeleteNvmeSubsystem \"{name : 'nvmeSubsystems/subsystem2'}\"\n```\n\n```bash\n# HTTP requests\n# inventory\ncurl -kL http://10.10.10.10:8082/v1/inventory/1/inventory/2\n\n# Nvme\n# create\ncurl -X POST -f http://10.10.10.10:8082/v1/nvmeRemoteControllers?nvme_remote_controller_id=nvmetcp12 -d '{\"multipath\": \"NVME_MULTIPATH_MULTIPATH\"}'\ncurl -X POST -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12/nvmePaths?nvme_path_id=nvmetcp12path0 -d '{\"traddr\":\"11.11.11.2\", \"trtype\":\"NVME_TRANSPORT_TYPE_TCP\", \"fabrics\":{\"subnqn\":\"nqn.2016-06.com.opi.spdk.target0\", \"trsvcid\":\"4444\", \"adrfam\":\"NVME_ADDRESS_FAMILY_IPV4\", \"hostnqn\":\"nqn.2014-08.org.nvmexpress:uuid:feb98abe-d51f-40c8-b348-2753f3571d3c\"}}'\ncurl -X POST -f http://10.10.10.10:8082/v1/nvmeSubsystems?nvme_subsystem_id=subsys0 -d '{\"spec\": {\"nqn\": \"nqn.2022-09.io.spdk:opitest1\"}}'\ncurl -X POST -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeNamespaces?nvme_namespace_id=namespace0 -d '{\"spec\": {\"volume_name_ref\": \"Malloc0\", \"host_nsid\": 10}}'\ncurl -X POST -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeControllers?nvme_controller_id=ctrl0 -d '{\"spec\": {\"trtype\": \"NVME_TRANSPORT_TYPE_TCP\", \"fabrics_id\":{\"traddr\": \"127.0.0.1\", \"trsvcid\": \"4421\", \"adrfam\": \"NVME_ADDRESS_FAMILY_IPV4\"}}}'\n# get\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12/nvmePaths/nvmetcp12path0\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeNamespaces/namespace0\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeControllers/ctrl0\n# list\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeRemoteControllers\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12/nvmePaths\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeNamespaces\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeControllers\n# stats\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12:stats\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12/nvmePaths/nvmetcp12path0:stats\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0:stats\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeNamespaces/namespace0:stats\ncurl -X GET -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeControllers/ctrl0:stats\n# update\ncurl -X PATCH -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12 -d '{\"multipath\": \"NVME_MULTIPATH_MULTIPATH\"}'\ncurl -X PATCH -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12/nvmePaths/nvmetcp12path0 -d '{\"traddr\":\"11.11.11.2\", \"trtype\":\"NVME_TRANSPORT_TYPE_TCP\", \"fabrics\":{\"subnqn\":\"nqn.2016-06.com.opi.spdk.target0\", \"trsvcid\":\"4444\", \"adrfam\":\"NVME_ADDRESS_FAMILY_IPV4\", \"hostnqn\":\"nqn.2014-08.org.nvmexpress:uuid:feb98abe-d51f-40c8-b348-2753f3571d3c\"}}'\ncurl -X PATCH -k http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeNamespaces/namespace0 -d '{\"spec\": {\"volume_name_ref\": \"Malloc1\", \"host_nsid\": 10}}'\ncurl -X PATCH -k http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeControllers/ctrl0 -d '{\"spec\": {\"trtype\": \"NVME_TRANSPORT_TYPE_TCP\", \"fabrics_id\":{\"traddr\": \"127.0.0.1\", \"trsvcid\": \"4421\", \"adrfam\": \"NVME_ADDRESS_FAMILY_IPV4\"}}}'\n# delete\ncurl -X DELETE -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeControllers/ctrl0\ncurl -X DELETE -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0/nvmeNamespaces/namespace0\ncurl -X DELETE -f http://10.10.10.10:8082/v1/nvmeSubsystems/subsys0\ncurl -X DELETE -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12/nvmePaths/nvmetcp12path0\ncurl -X DELETE -f http://10.10.10.10:8082/v1/nvmeRemoteControllers/nvmetcp12\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopiproject%2Fopi-marvell-bridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopiproject%2Fopi-marvell-bridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopiproject%2Fopi-marvell-bridge/lists"}