{"id":37097107,"url":"https://github.com/ligato/cn-infra","last_synced_at":"2026-01-14T11:56:40.121Z","repository":{"id":22305194,"uuid":"94889501","full_name":"ligato/cn-infra","owner":"ligato","description":"🌥 Cloud-native framework for developing pluggable service agents ","archived":false,"fork":false,"pushed_at":"2024-11-19T06:15:04.000Z","size":78369,"stargazers_count":101,"open_issues_count":19,"forks_count":47,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-01-06T20:29:23.631Z","etag":null,"topics":["cloud-native","framework","ligato","management-agents","microservices","pluggable"],"latest_commit_sha":null,"homepage":"https://docs.ligato.io/","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/ligato.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-20T12:37:37.000Z","updated_at":"2024-09-03T02:27:26.000Z","dependencies_parsed_at":"2024-06-18T13:55:08.195Z","dependency_job_id":"fcf6fb32-64cb-40d9-aeba-dabea17a975d","html_url":"https://github.com/ligato/cn-infra","commit_stats":{"total_commits":1756,"total_committers":27,"mean_commits":65.03703703703704,"dds":0.7283599088838268,"last_synced_commit":"012faf45555e52dc5bf71a6adc9680b5bcd30665"},"previous_names":["ligato/cnf-infra"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/ligato/cn-infra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ligato%2Fcn-infra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ligato%2Fcn-infra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ligato%2Fcn-infra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ligato%2Fcn-infra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ligato","download_url":"https://codeload.github.com/ligato/cn-infra/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ligato%2Fcn-infra/sbom","scorecard":{"id":589011,"data":{"date":"2025-08-11","repo":{"name":"github.com/ligato/cn-infra","commit":"356dce1f1754fdc28af2cab9df30603a383be829"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":8,"reason":"Found 16/19 approved changesets -- score normalized to 8","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: docker/dev_cn_infra/Dockerfile:1: pin your Docker image by updating ubuntu:16.04 to ubuntu:16.04@sha256:1f1a2d56de1d604801a9671f301190704c25d604a416f59e03c04f5c6ffee0d6","Warn: goCommand not pinned by hash: docker/dev_cn_infra/Dockerfile:32","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   1 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"17 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3553 / GHSA-mh63-6h87-95cp","Warn: Project is vulnerable to: GO-2024-3250 / GHSA-29wx-vh33-7x7r","Warn: Project is vulnerable to: GO-2023-2331 / GHSA-8pgv-569h-w5rw","Warn: Project is vulnerable to: GO-2024-2961","Warn: Project is vulnerable to: GO-2023-2402 / GHSA-45x7-px36-x8w8","Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2023-1571 / GHSA-vvpx-j8f3-3w6h","Warn: Project is vulnerable to: GO-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GO-2023-2153 / GHSA-m425-mq94-257g / GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9","Warn: Project is vulnerable to: GO-2024-2611 / GHSA-8r3f-844c-mc37"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T21:21:09.557Z","repository_id":22305194,"created_at":"2025-08-20T21:21:09.557Z","updated_at":"2025-08-20T21:21:09.557Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28419272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T10:47:48.104Z","status":"ssl_error","status_checked_at":"2026-01-14T10:46:19.031Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cloud-native","framework","ligato","management-agents","microservices","pluggable"],"created_at":"2026-01-14T11:56:39.448Z","updated_at":"2026-01-14T11:56:40.115Z","avatar_url":"https://github.com/ligato.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CN-Infra\n\n[![Build Status](https://travis-ci.org/ligato/cn-infra.svg?branch=master)](https://travis-ci.org/ligato/cn-infra)\n[![Coverage Status](https://coveralls.io/repos/github/ligato/cn-infra/badge.svg?branch=master)](https://coveralls.io/github/ligato/cn-infra?branch=master)\n[![Go Report Card](https://goreportcard.com/badge/github.com/ligato/cn-infra)](https://goreportcard.com/report/github.com/ligato/cn-infra)\n[![GitHub license](https://img.shields.io/badge/license-Apache%20license%202.0-blue.svg)](https://github.com/ligato/cn-infra/blob/master/LICENSE.md)\n\nCN-Infra (cloud-native infrastructure) is a Golang framework for building\ncontrol plane agents for cloud-native Virtual Network Functions It is\nbasically a collection of components/libraries used in most control plane \nagents tied together with a common life-cycle management mechanism.\n\n## Documentation\n[![PkgGoDev](https://pkg.go.dev/badge/go.ligato.io/cn-infra/v2)](https://pkg.go.dev/go.ligato.io/cn-infra/v2)\n\nExtensive documentation with [tutorials](https://docs.ligato.io/en/latest/tutorials/01_hello-world/) \u0026 how-to guides can be found at [docs.ligato.io](https://docs.ligato.io/).\n\n## Quickstart\n\nA very simple example of a control plane agent that uses Etcd as its configuration data store \nis as follows:\n\n```go\nfunc main() {\n\t// Create agent with connector plugins\n\ta := agent.NewAgent(agent.AllPlugins(\n\t\t\u0026etcd.DefaultPlugin,\n\t\t\u0026resync.DefaultPlugin,\n\t))\n\n\tif err := a.Run(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n```\nYou can find the above example [here][simple-agent], from where it can be \ncompiled and run in your favorite environment.\n\n## Architecture\n\nEach management/control plane app built on top of the CN-Infra framework is \nbasically a set of modules called \"plugins\" in CN-Infra lingo, where each \nplugin provides a very specific/focused functionality. Some plugins are \nprovided by the CN-Infra framework itself, some are written by the app's \nimplementors. In other words, the CN-Infra framework itself is implemented\nas a set of plugins that together provide the framework's functionality, \nsuch as logging, health checks, messaging (e.g. Kafka), a common front-end\nAPI and back-end connectivity to various KV data stores (Etcd, Cassandra, \nRedis, ...), and REST and gRPC APIs. \n\nThe architecture of the CN-Infra framework is shown in the following figure.\n\n![arch](docs/imgs/high_level_arch_cninfra.png \"High Level Architecture of cn-infra\")\n\nThe CN-Infra framework consists of a **[Agent][agent]** that provides plugin\nlifecycle management (initialization and graceful shutdown of plugins) \nand a set of framework plugins. Note that the figure shows not only \nCN-Infra plugins that are a part of the CN-Infra framework, but also \napp plugins that use the framework. CN-Infra framework plugins provide \nAPIs that are consumed by app plugins. App plugins themselves may \nprovide their own APIs consumed by external clients.\n\nThe framework is modular and extensible. Plugins supporting new functionality\n(e.g. another KV store or another message bus) can be easily added to the\nexisting set of CN-Infra framework plugins. Moreover, CN-Infra based apps\ncan be built in layers: a set of app plugins together with CN-Infra plugins\ncan form a new framework providing APIs/services to higher layer apps. \nThis approach was used in the [VPP Agent][vpp-agent] - a management/control agent\nfor [VPP][vpp] based software data planes.,\n\nExtending the code base does not mean that all plugins end up in all \napps - app writers can pick and choose only those framework plugins that \nare required by their app; for example, if an app does not need a KV \nstore, the CN-Infra framework KV data store plugins would not be included\nin the app. All plugins used in an app are statically linked into the \napp.\n\n### Available CN-Infra Plugins:\n\nA CN-Infra plugin is typically implemented as a library providing the \nplugin's functionality/APIs wrapped in a plugin wrapper. A CN-Infra \nlibrary can also be used standalone in 3rd party apps that do not use\nthe CN-Infra framework. The plugin wrapper provides lifecycle management \nfor the plugin component.\n\nPlugins in the current CN-Infra release provide functionality in one of \nthe following functional areas:\n\n* **RPC** - allows to expose application's API:\n  - [GRPC][docs-grpc] - handles GRPC requests and allows app plugins to define\n    their own GRPC services\n  - [REST][docs-rest] - handles HTTP requests and allows app plugins to define\n    their own REST APIs\n  - Prometheus - serves Prometheus metrics via HTTP and allows\n    app plugins to register their own collectors\n        \n* **Data Stores** - provides a common data store API for app plugins (the \n    Data Broker) and back-end clients. The data store related plugins are:\n  - [Consul][docs-consul] - key-value data store adapter for Consul\n  - [Etcd][docs-etcd] - key-value data store adapter for Etcd\n  - [Redis][docs-redis] - key-value data store adapter for Redis\n  - [Casssandra][cassandra] - key-value data store adapter for Cassandra\n  - [FileDB][docs-filedb] - key-value data store using OS filesystem\n    \n* **Messaging** - provides a common API and connectivity to message buses:\n  - [Kafka][docs-kafka] - adapter for the Kafka message bus (built on top of\n    Sarama)\n    \n* **Logging**:\n  - [Logrus wrapper][logrus] - implements logging skeleton \n    using the Logrus library. An app writer can create multiple loggers -\n    for example, each app plugin can have its own logger. Log level\n    for each logger can be controlled individually at run time through\n    the Log Manager REST API.\n  - [Log Manager][docs-logmanager] - allows the operator to set log\n    level for each logger using a REST API.\n    \n* **Health Monitoring** - Self health check mechanism between plugins \n    plus RPCs:\n  - [StatusCheck][docs-statuscheck] - allows to monitor the status of plugins\n    and exposes it via HTTP\n  - [Probe][probe] - callable remotely from K8s\n  \n* **Miscellaneous** - value-add plugins supporting the operation of a \n    CN-Infra based application: \n  - [Config][config] - helpers for loading plugin configuration.\n  - [Datasync][resync] - provides data resynchronization after HA \n    events (restart or connectivity restoration after an outage) for data\n    stores, gRPC and REST.\n  - [IDX Map][idx-map] - reusable thread-safe map with advanced features:\n    * multiple subscribers for watching changes in the map\n    * secondary indexes\n  - [ServiceLabel][docs-service-label] - provides setting and retrieval of a \n      unique identifier for a CN-Infra based app. A cloud app typically needs\n      a unique identifier so that it can differentiated from other instances \n      of the same app or from other apps (e.g. to have its own space in a kv \n      data store).\n\n## Contributing\n\nIf you are interested in contributing, please see the [contribution guidelines](CONTRIBUTING.md).\n\n[agent]: agent\n[cassandra]: db/sql/cassandra\n[config]: config\n[dockerhub]: https://hub.docker.com/r/ligato/dev-cn-infra/\n[docs-consul]: https://docs.ligato.io/en/latest/plugins/db-plugins/#consul\n[docs-etcd]: https://docs.ligato.io/en/latest/plugins/db-plugins/#etcd\n[docs-grpc]: https://docs.ligato.io/en/latest/plugins/connection-plugins/#grpc-plugin\n[docs-kafka]: https://docs.ligato.io/en/latest/plugins/plugin-overview/#messagingkafka\n[docs-logmanager]: https://docs.ligato.io/en/latest/plugins/infra-plugins/#log-manager\n[docs-statuscheck]: https://docs.ligato.io/en/latest/plugins/infra-plugins/#status-check\n[docs-redis]: https://docs.ligato.io/en/latest/plugins/db-plugins/#redis\n[docs-rest]: https://docs.ligato.io/en/latest/plugins/connection-plugins/#rest-plugin\n[docs-service-label]: https://docs.ligato.io/en/latest/plugins/infra-plugins/#service-label\n[idx-map]: idxmap\n[logrus]: logging/logrus\n[probe]: health/probe\n[resync]: datasync/resync\n[simple-agent]: examples/simple-agent/README.md\n[vpp]: https://fd.io\n[vpp-agent]: https://github.com/ligato/vpp-agent\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fligato%2Fcn-infra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fligato%2Fcn-infra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fligato%2Fcn-infra/lists"}