├── .dockerignore
├── .github
├── CODEOWNERS
├── PULL_REQUEST_TEMPLATE.md
├── dependabot.yml
└── workflows
│ ├── adm-component-test.yml
│ ├── arm-component-test.yml
│ ├── auto-close.yml
│ ├── auto-update.yml
│ ├── common-comp-tests.yml
│ ├── go-fuzz.yml
│ ├── post-merge-adm-nbi.yaml
│ ├── post-merge-adm.yaml
│ ├── post-merge-arm.yaml
│ ├── post-merge-asp.yaml
│ ├── post-merge-interconnect.yaml
│ └── pre-merge.yml
├── .gitignore
├── .markdownlint.yml
├── .markdownlintignore
├── CODE_OF_CONDUCT.md
├── LICENSES
└── Apache-2.0.txt
├── Makefile
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── REUSE.toml
├── SECURITY.md
├── VERSION
├── app-deployment-manager
├── .golangci.yml
├── Dockerfile
├── LICENSES
│ └── Apache-2.0.txt
├── Makefile
├── PROJECT
├── README.md
├── REUSE.toml
├── VERSION
├── api
│ ├── nbi
│ │ ├── VERSION
│ │ └── v2
│ │ │ ├── deployment
│ │ │ └── v1
│ │ │ │ ├── cluster_service.pb.go
│ │ │ │ ├── cluster_service.pb.gw.go
│ │ │ │ ├── cluster_service.proto
│ │ │ │ ├── cluster_service_grpc.pb.go
│ │ │ │ ├── resources.pb.go
│ │ │ │ ├── resources.proto
│ │ │ │ ├── service.pb.go
│ │ │ │ ├── service.pb.gw.go
│ │ │ │ ├── service.proto
│ │ │ │ └── service_grpc.pb.go
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── pkg
│ │ │ └── restClient
│ │ │ │ ├── client.go
│ │ │ │ └── types.go
│ │ │ └── spec
│ │ │ └── openapi.yaml
│ ├── spec
│ │ └── openapi.yaml
│ └── v1beta1
│ │ ├── cluster_types.go
│ │ ├── deployment_types.go
│ │ ├── deploymentcluster_types.go
│ │ ├── groupversion_info.go
│ │ └── zz_generated.deepcopy.go
├── buf.gen.yaml
├── buf.yaml
├── build
│ └── Dockerfile.gateway
├── cmd
│ ├── app-deployment-manager
│ │ └── main.go
│ └── rest-proxy
│ │ └── rest-proxy.go
├── controllers
│ ├── capi
│ │ └── capi_controller.go
│ ├── cluster
│ │ ├── cluster_controller.go
│ │ ├── cluster_controller_test.go
│ │ └── suite_test.go
│ ├── controller.go
│ ├── deployment
│ │ ├── deployment_controller.go
│ │ ├── deployment_controller_test.go
│ │ └── suite_test.go
│ ├── deploymentcluster
│ │ ├── deploymentcluster_controller.go
│ │ ├── deploymentcluster_controller_test.go
│ │ └── suite_test.go
│ └── license.go.txt
├── deployment
│ └── charts
│ │ ├── app-deployment-crd
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── templates
│ │ │ ├── app.edge-orchestrator.intel.com_clusters.yaml
│ │ │ ├── app.edge-orchestrator.intel.com_deploymentclusters.yaml
│ │ │ └── app.edge-orchestrator.intel.com_deployments.yaml
│ │ └── values.yaml
│ │ └── app-deployment-manager
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── files
│ │ ├── grafana
│ │ │ ├── admin
│ │ │ │ ├── app-orch-scale.json
│ │ │ │ ├── controller-resources-metrics.json
│ │ │ │ └── controller-runtime-metrics.json
│ │ │ └── customer
│ │ │ │ └── adm-status.json
│ │ └── openpolicyagent
│ │ │ ├── common.rego
│ │ │ ├── common_test.rego
│ │ │ ├── create.rego
│ │ │ ├── create_test.rego
│ │ │ ├── delete.rego
│ │ │ ├── delete_test.rego
│ │ │ ├── get.rego
│ │ │ ├── get_app_namespace.rego
│ │ │ ├── get_app_namespace_test.rego
│ │ │ ├── get_kubeconfig.rego
│ │ │ ├── get_kubeconfig_test.rego
│ │ │ ├── get_test.rego
│ │ │ ├── list.rego
│ │ │ ├── list_cluster.rego
│ │ │ ├── list_cluster_test.rego
│ │ │ ├── list_deployment_clusters.rego
│ │ │ ├── list_deployment_clusters_test.rego
│ │ │ ├── list_test.rego
│ │ │ ├── update.rego
│ │ │ └── update_test.rego
│ │ ├── templates
│ │ ├── NOTES.txt
│ │ ├── _helpers.tpl
│ │ ├── cert-webhook.yaml
│ │ ├── configmap.yaml
│ │ ├── deployment-adm.yaml
│ │ ├── deployment-gateway.yaml
│ │ ├── rbac.yaml
│ │ ├── service-gateway.yaml
│ │ ├── service-metrics.yaml
│ │ ├── service-webhook.yaml
│ │ ├── serviceaccount.yaml
│ │ └── webhook-configs.yaml
│ │ └── values.yaml
├── go.mod
├── go.sum
├── grafana
│ ├── Time_measurement_dashboard.json
│ ├── controller-resources-metrics.json
│ ├── controller-runtime-metrics.json
│ └── custom-metrics
│ │ └── config.yaml
├── hadolint.yml
├── internal
│ ├── catalogclient
│ │ ├── catalogclient.go
│ │ ├── catalogclient_suite_test.go
│ │ ├── catalogclient_test.go
│ │ ├── export_test.go
│ │ ├── mockery
│ │ │ └── mockery_catalogclient.go
│ │ └── mocks
│ │ │ └── mock_catalogclient.go
│ ├── grafana
│ │ ├── mockery
│ │ │ ├── mockery_corev1interface.go
│ │ │ └── mockery_secretinterface.go
│ │ └── status.go
│ ├── istio
│ │ └── config.go
│ ├── manager
│ │ ├── manager.go
│ │ ├── manager_suite_test.go
│ │ ├── migration.go
│ │ └── migration_test.go
│ ├── metrics
│ │ └── metrics.go
│ ├── northbound
│ │ ├── app_dependency.go
│ │ ├── app_dependency_test.go
│ │ ├── authorization.go
│ │ ├── authorization_test.go
│ │ ├── cluster.go
│ │ ├── cluster_test.go
│ │ ├── datadelection_test.go
│ │ ├── dataselection.go
│ │ ├── fuzztests
│ │ │ ├── northbound_fuzz_test.go
│ │ │ └── rest_gateway_fuzz_test.go
│ │ ├── mocks
│ │ │ ├── m2m_mocks.go
│ │ │ ├── mock_deployment_service.go
│ │ │ └── mocks.go
│ │ ├── northbound.go
│ │ ├── northbound_test.go
│ │ ├── register.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── patch
│ │ ├── options.go
│ │ ├── patch.go
│ │ └── suit_test.go
│ ├── randomtoken
│ │ ├── token.go
│ │ └── token_test.go
│ ├── restproxy
│ │ └── rest-proxy.go
│ └── tenant
│ │ └── nexus-hook.go
├── main.go
├── pkg
│ ├── appdeploymentclient
│ │ └── v1beta1
│ │ │ ├── appdeployment_client.go
│ │ │ ├── appdeployment_client_test.go
│ │ │ ├── cluster_client.go
│ │ │ ├── cluster_client_test.go
│ │ │ ├── deployment_client.go
│ │ │ ├── deployment_client_test.go
│ │ │ ├── deploymentclusters_client.go
│ │ │ ├── deploymentclusters_client_test.go
│ │ │ └── v1alpha3_suite_test.go
│ ├── fleet
│ │ ├── bundle_client.go
│ │ ├── bundle_client_test.go
│ │ ├── cluster_client.go
│ │ ├── cluster_client_test.go
│ │ ├── configgen.go
│ │ ├── configgen_suite_test.go
│ │ ├── configgen_test.go
│ │ ├── mocks
│ │ │ └── mocks.go
│ │ └── test
│ │ │ └── crd
│ │ │ └── fleet-crd-v0.5.yaml
│ ├── gitclient
│ │ ├── gitclient.go
│ │ ├── gitclient_suite_test.go
│ │ ├── gitclient_test.go
│ │ └── mocks_test.go
│ ├── k8sclient
│ │ ├── client.go
│ │ └── client_test.go
│ ├── logchecker
│ │ ├── logchecker.go
│ │ └── logchecker_test.go
│ ├── utils
│ │ ├── dataselector
│ │ │ ├── dataselector.go
│ │ │ ├── dataselector_test.go
│ │ │ ├── datatypes
│ │ │ │ ├── clusterinfo.go
│ │ │ │ ├── clusterinfo_test.go
│ │ │ │ ├── deployment.go
│ │ │ │ ├── deployment_cluster.go
│ │ │ │ ├── deployment_cluster_test.go
│ │ │ │ └── deployment_test.go
│ │ │ ├── pagination.go
│ │ │ ├── pagination_test.go
│ │ │ ├── query.go
│ │ │ └── std_comparable_types.go
│ │ ├── env_vars.go
│ │ ├── env_vars_test.go
│ │ ├── k8serrors
│ │ │ ├── k8serrors.go
│ │ │ └── k8serrors_test.go
│ │ ├── parser
│ │ │ ├── query_param_parser.go
│ │ │ └── query_param_parser_test.go
│ │ ├── ratelimiter
│ │ │ └── utils.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ └── vault
│ │ ├── manager.go
│ │ └── manager_test.go
├── requirements.txt
├── test
│ ├── auth
│ │ ├── auth_test.go
│ │ └── suite_test.go
│ ├── deployment_create
│ │ ├── create_deployment_test.go
│ │ └── suite_test.go
│ ├── deployment_delete
│ │ ├── deployment_delete_test.go
│ │ └── suite_test.go
│ ├── deployment_status
│ │ ├── deployment_status_test.go
│ │ └── suite_test.go
│ ├── methods
│ │ ├── methods_test.go
│ │ └── suite_test.go
│ ├── negative
│ │ ├── negative_test.go
│ │ └── suite_test.go
│ └── template.html
└── webhooks
│ └── deployment
│ ├── deployment_webhook.go
│ ├── deployment_webhook_test.go
│ └── suite_test.go
├── app-interconnect
├── .golangci.yml
├── LICENSES
│ └── Apache-2.0.txt
├── Makefile
├── README.md
├── REUSE.toml
├── VERSION
├── build
│ └── Dockerfile
├── cmd
│ └── interconnect-manager
│ │ └── interconnect-manager.go
├── config
│ └── crds
│ │ ├── interconnect.app.edge-orchestrator.intel.com_clusters.yaml
│ │ ├── interconnect.app.edge-orchestrator.intel.com_links.yaml
│ │ ├── interconnect.app.edge-orchestrator.intel.com_services.yaml
│ │ ├── network.app.edge-orchestrator.intel.com_networkclusters.yaml
│ │ ├── network.app.edge-orchestrator.intel.com_networklinks.yaml
│ │ ├── network.app.edge-orchestrator.intel.com_networks.yaml
│ │ └── network.app.edge-orchestrator.intel.com_networkservices.yaml
├── deploy
│ └── charts
│ │ └── app-interconnect-manager
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── crds
│ │ ├── interconnect.app.edge-orchestrator.intel.com_clusters.yaml
│ │ ├── interconnect.app.edge-orchestrator.intel.com_links.yaml
│ │ ├── interconnect.app.edge-orchestrator.intel.com_services.yaml
│ │ ├── network.app.edge-orchestrator.intel.com_networkclusters.yaml
│ │ ├── network.app.edge-orchestrator.intel.com_networklinks.yaml
│ │ ├── network.app.edge-orchestrator.intel.com_networks.yaml
│ │ └── network.app.edge-orchestrator.intel.com_networkservices.yaml
│ │ ├── templates
│ │ ├── _helpers.tpl
│ │ ├── clusterrole.yaml
│ │ ├── clusterrolebinding.yaml
│ │ ├── configmap.yaml
│ │ ├── deployment.yaml
│ │ └── serviceaccount.yaml
│ │ └── values.yaml
├── go.mod
├── go.sum
├── hack
│ ├── boilerplate.go.txt
│ └── update-codegen.sh
├── internal
│ ├── cluster
│ │ ├── interface.go
│ │ ├── local.go
│ │ └── orch.go
│ ├── controller
│ │ ├── controller.go
│ │ ├── interconnect
│ │ │ ├── cluster_controller.go
│ │ │ ├── clusterstatus_controller.go
│ │ │ ├── controllers.go
│ │ │ ├── link_controller.go
│ │ │ └── service_controller.go
│ │ ├── network
│ │ │ ├── controllers.go
│ │ │ ├── deployment_controller.go
│ │ │ ├── deploymentcluster_controller.go
│ │ │ ├── deploymentservice_controller.go
│ │ │ ├── deploymentservice_source.go
│ │ │ ├── meta.go
│ │ │ ├── networkcluster_controller.go
│ │ │ ├── networkclusterlink_controller.go
│ │ │ ├── networkclusterstatus_controller.go
│ │ │ ├── networklink_controller.go
│ │ │ └── networkservice_controller.go
│ │ └── utils
│ │ │ └── project_types.go
│ ├── skupper
│ │ ├── NOTE.md
│ │ ├── api
│ │ │ └── types
│ │ │ │ ├── client.go
│ │ │ │ ├── crds
│ │ │ │ ├── skupper_cluster_policy_cr_sample_01.yaml
│ │ │ │ ├── skupper_cluster_policy_cr_sample_02.yaml
│ │ │ │ ├── skupper_cluster_policy_cr_sample_03.yaml
│ │ │ │ └── skupper_cluster_policy_crd.yaml
│ │ │ │ ├── types.go
│ │ │ │ └── types_test.go
│ │ ├── client
│ │ │ ├── client.go
│ │ │ ├── client_debug.go
│ │ │ ├── client_mock_test.go
│ │ │ ├── client_test.go
│ │ │ ├── connector_create.go
│ │ │ ├── connector_create_test.go
│ │ │ ├── connector_inspect.go
│ │ │ ├── connector_inspect_test.go
│ │ │ ├── connector_list.go
│ │ │ ├── connector_remove.go
│ │ │ ├── connector_remove_test.go
│ │ │ ├── connector_token_create.go
│ │ │ ├── connector_token_create_test.go
│ │ │ ├── container
│ │ │ │ ├── client.go
│ │ │ │ └── informer.go
│ │ │ ├── gateway.go
│ │ │ ├── gateway_test.go
│ │ │ ├── generated
│ │ │ │ └── libpod
│ │ │ │ │ ├── client
│ │ │ │ │ ├── containers
│ │ │ │ │ │ ├── container_attach_libpod_parameters.go
│ │ │ │ │ │ ├── container_attach_libpod_responses.go
│ │ │ │ │ │ ├── container_changes_libpod_parameters.go
│ │ │ │ │ │ ├── container_changes_libpod_responses.go
│ │ │ │ │ │ ├── container_checkpoint_libpod_parameters.go
│ │ │ │ │ │ ├── container_checkpoint_libpod_responses.go
│ │ │ │ │ │ ├── container_create_libpod_parameters.go
│ │ │ │ │ │ ├── container_create_libpod_responses.go
│ │ │ │ │ │ ├── container_delete_libpod_parameters.go
│ │ │ │ │ │ ├── container_delete_libpod_responses.go
│ │ │ │ │ │ ├── container_exists_libpod_parameters.go
│ │ │ │ │ │ ├── container_exists_libpod_responses.go
│ │ │ │ │ │ ├── container_export_libpod_parameters.go
│ │ │ │ │ │ ├── container_export_libpod_responses.go
│ │ │ │ │ │ ├── container_healthcheck_libpod_parameters.go
│ │ │ │ │ │ ├── container_healthcheck_libpod_responses.go
│ │ │ │ │ │ ├── container_init_libpod_parameters.go
│ │ │ │ │ │ ├── container_init_libpod_responses.go
│ │ │ │ │ │ ├── container_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── container_inspect_libpod_responses.go
│ │ │ │ │ │ ├── container_kill_libpod_parameters.go
│ │ │ │ │ │ ├── container_kill_libpod_responses.go
│ │ │ │ │ │ ├── container_list_libpod_parameters.go
│ │ │ │ │ │ ├── container_list_libpod_responses.go
│ │ │ │ │ │ ├── container_logs_libpod_parameters.go
│ │ │ │ │ │ ├── container_logs_libpod_responses.go
│ │ │ │ │ │ ├── container_mount_libpod_parameters.go
│ │ │ │ │ │ ├── container_mount_libpod_responses.go
│ │ │ │ │ │ ├── container_pause_libpod_parameters.go
│ │ │ │ │ │ ├── container_pause_libpod_responses.go
│ │ │ │ │ │ ├── container_prune_libpod_parameters.go
│ │ │ │ │ │ ├── container_prune_libpod_responses.go
│ │ │ │ │ │ ├── container_rename_libpod_parameters.go
│ │ │ │ │ │ ├── container_rename_libpod_responses.go
│ │ │ │ │ │ ├── container_resize_libpod_parameters.go
│ │ │ │ │ │ ├── container_resize_libpod_responses.go
│ │ │ │ │ │ ├── container_restart_libpod_parameters.go
│ │ │ │ │ │ ├── container_restart_libpod_responses.go
│ │ │ │ │ │ ├── container_restore_libpod_parameters.go
│ │ │ │ │ │ ├── container_restore_libpod_responses.go
│ │ │ │ │ │ ├── container_show_mounted_libpod_parameters.go
│ │ │ │ │ │ ├── container_show_mounted_libpod_responses.go
│ │ │ │ │ │ ├── container_start_libpod_parameters.go
│ │ │ │ │ │ ├── container_start_libpod_responses.go
│ │ │ │ │ │ ├── container_stats_libpod_parameters.go
│ │ │ │ │ │ ├── container_stats_libpod_responses.go
│ │ │ │ │ │ ├── container_stop_libpod_parameters.go
│ │ │ │ │ │ ├── container_stop_libpod_responses.go
│ │ │ │ │ │ ├── container_top_libpod_parameters.go
│ │ │ │ │ │ ├── container_top_libpod_responses.go
│ │ │ │ │ │ ├── container_unmount_libpod_parameters.go
│ │ │ │ │ │ ├── container_unmount_libpod_responses.go
│ │ │ │ │ │ ├── container_unpause_libpod_parameters.go
│ │ │ │ │ │ ├── container_unpause_libpod_responses.go
│ │ │ │ │ │ ├── container_wait_libpod_parameters.go
│ │ │ │ │ │ ├── container_wait_libpod_responses.go
│ │ │ │ │ │ ├── containers_client.go
│ │ │ │ │ │ ├── containers_stats_all_libpod_parameters.go
│ │ │ │ │ │ ├── containers_stats_all_libpod_responses.go
│ │ │ │ │ │ ├── generate_kube_libpod_parameters.go
│ │ │ │ │ │ ├── generate_kube_libpod_responses.go
│ │ │ │ │ │ ├── generate_systemd_libpod_parameters.go
│ │ │ │ │ │ ├── generate_systemd_libpod_responses.go
│ │ │ │ │ │ ├── image_commit_libpod_parameters.go
│ │ │ │ │ │ ├── image_commit_libpod_responses.go
│ │ │ │ │ │ ├── play_kube_down_libpod_parameters.go
│ │ │ │ │ │ ├── play_kube_down_libpod_responses.go
│ │ │ │ │ │ ├── play_kube_libpod_parameters.go
│ │ │ │ │ │ ├── play_kube_libpod_responses.go
│ │ │ │ │ │ ├── put_container_archive_libpod_parameters.go
│ │ │ │ │ │ └── put_container_archive_libpod_responses.go
│ │ │ │ │ ├── containers_compat
│ │ │ │ │ │ ├── container_archive_libpod_parameters.go
│ │ │ │ │ │ ├── container_archive_libpod_responses.go
│ │ │ │ │ │ ├── container_archive_parameters.go
│ │ │ │ │ │ ├── container_archive_responses.go
│ │ │ │ │ │ ├── container_attach_parameters.go
│ │ │ │ │ │ ├── container_attach_responses.go
│ │ │ │ │ │ ├── container_create_parameters.go
│ │ │ │ │ │ ├── container_create_responses.go
│ │ │ │ │ │ ├── container_delete_parameters.go
│ │ │ │ │ │ ├── container_delete_responses.go
│ │ │ │ │ │ ├── container_export_parameters.go
│ │ │ │ │ │ ├── container_export_responses.go
│ │ │ │ │ │ ├── container_inspect_parameters.go
│ │ │ │ │ │ ├── container_inspect_responses.go
│ │ │ │ │ │ ├── container_kill_parameters.go
│ │ │ │ │ │ ├── container_kill_responses.go
│ │ │ │ │ │ ├── container_list_parameters.go
│ │ │ │ │ │ ├── container_list_responses.go
│ │ │ │ │ │ ├── container_logs_parameters.go
│ │ │ │ │ │ ├── container_logs_responses.go
│ │ │ │ │ │ ├── container_pause_parameters.go
│ │ │ │ │ │ ├── container_pause_responses.go
│ │ │ │ │ │ ├── container_prune_parameters.go
│ │ │ │ │ │ ├── container_prune_responses.go
│ │ │ │ │ │ ├── container_rename_parameters.go
│ │ │ │ │ │ ├── container_rename_responses.go
│ │ │ │ │ │ ├── container_resize_parameters.go
│ │ │ │ │ │ ├── container_resize_responses.go
│ │ │ │ │ │ ├── container_restart_parameters.go
│ │ │ │ │ │ ├── container_restart_responses.go
│ │ │ │ │ │ ├── container_start_parameters.go
│ │ │ │ │ │ ├── container_start_responses.go
│ │ │ │ │ │ ├── container_stats_parameters.go
│ │ │ │ │ │ ├── container_stats_responses.go
│ │ │ │ │ │ ├── container_stop_parameters.go
│ │ │ │ │ │ ├── container_stop_responses.go
│ │ │ │ │ │ ├── container_top_parameters.go
│ │ │ │ │ │ ├── container_top_responses.go
│ │ │ │ │ │ ├── container_unpause_parameters.go
│ │ │ │ │ │ ├── container_unpause_responses.go
│ │ │ │ │ │ ├── container_wait_parameters.go
│ │ │ │ │ │ ├── container_wait_responses.go
│ │ │ │ │ │ ├── containers_compat_client.go
│ │ │ │ │ │ ├── image_commit_parameters.go
│ │ │ │ │ │ ├── image_commit_responses.go
│ │ │ │ │ │ ├── put_container_archive_parameters.go
│ │ │ │ │ │ └── put_container_archive_responses.go
│ │ │ │ │ ├── exec
│ │ │ │ │ │ ├── container_exec_libpod_parameters.go
│ │ │ │ │ │ ├── container_exec_libpod_responses.go
│ │ │ │ │ │ ├── exec_client.go
│ │ │ │ │ │ ├── exec_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── exec_inspect_libpod_responses.go
│ │ │ │ │ │ ├── exec_resize_libpod_parameters.go
│ │ │ │ │ │ ├── exec_resize_libpod_responses.go
│ │ │ │ │ │ ├── exec_start_libpod_parameters.go
│ │ │ │ │ │ └── exec_start_libpod_responses.go
│ │ │ │ │ ├── exec_compat
│ │ │ │ │ │ ├── container_exec_parameters.go
│ │ │ │ │ │ ├── container_exec_responses.go
│ │ │ │ │ │ ├── exec_compat_client.go
│ │ │ │ │ │ ├── exec_inspect_parameters.go
│ │ │ │ │ │ ├── exec_inspect_responses.go
│ │ │ │ │ │ ├── exec_resize_parameters.go
│ │ │ │ │ │ ├── exec_resize_responses.go
│ │ │ │ │ │ ├── exec_start_parameters.go
│ │ │ │ │ │ └── exec_start_responses.go
│ │ │ │ │ ├── images
│ │ │ │ │ │ ├── image_build_libpod_parameters.go
│ │ │ │ │ │ ├── image_build_libpod_responses.go
│ │ │ │ │ │ ├── image_changes_libpod_parameters.go
│ │ │ │ │ │ ├── image_changes_libpod_responses.go
│ │ │ │ │ │ ├── image_delete_all_libpod_parameters.go
│ │ │ │ │ │ ├── image_delete_all_libpod_responses.go
│ │ │ │ │ │ ├── image_delete_libpod_parameters.go
│ │ │ │ │ │ ├── image_delete_libpod_responses.go
│ │ │ │ │ │ ├── image_exists_libpod_parameters.go
│ │ │ │ │ │ ├── image_exists_libpod_responses.go
│ │ │ │ │ │ ├── image_export_libpod_parameters.go
│ │ │ │ │ │ ├── image_export_libpod_responses.go
│ │ │ │ │ │ ├── image_get_libpod_parameters.go
│ │ │ │ │ │ ├── image_get_libpod_responses.go
│ │ │ │ │ │ ├── image_history_libpod_parameters.go
│ │ │ │ │ │ ├── image_history_libpod_responses.go
│ │ │ │ │ │ ├── image_import_libpod_parameters.go
│ │ │ │ │ │ ├── image_import_libpod_responses.go
│ │ │ │ │ │ ├── image_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── image_inspect_libpod_responses.go
│ │ │ │ │ │ ├── image_list_libpod_parameters.go
│ │ │ │ │ │ ├── image_list_libpod_responses.go
│ │ │ │ │ │ ├── image_load_libpod_parameters.go
│ │ │ │ │ │ ├── image_load_libpod_responses.go
│ │ │ │ │ │ ├── image_prune_libpod_parameters.go
│ │ │ │ │ │ ├── image_prune_libpod_responses.go
│ │ │ │ │ │ ├── image_pull_libpod_parameters.go
│ │ │ │ │ │ ├── image_pull_libpod_responses.go
│ │ │ │ │ │ ├── image_push_libpod_parameters.go
│ │ │ │ │ │ ├── image_push_libpod_responses.go
│ │ │ │ │ │ ├── image_search_libpod_parameters.go
│ │ │ │ │ │ ├── image_search_libpod_responses.go
│ │ │ │ │ │ ├── image_tag_libpod_parameters.go
│ │ │ │ │ │ ├── image_tag_libpod_responses.go
│ │ │ │ │ │ ├── image_tree_libpod_parameters.go
│ │ │ │ │ │ ├── image_tree_libpod_responses.go
│ │ │ │ │ │ ├── image_untag_libpod_parameters.go
│ │ │ │ │ │ ├── image_untag_libpod_responses.go
│ │ │ │ │ │ └── images_client.go
│ │ │ │ │ ├── images_compat
│ │ │ │ │ │ ├── image_build_parameters.go
│ │ │ │ │ │ ├── image_build_responses.go
│ │ │ │ │ │ ├── image_create_parameters.go
│ │ │ │ │ │ ├── image_create_responses.go
│ │ │ │ │ │ ├── image_delete_parameters.go
│ │ │ │ │ │ ├── image_delete_responses.go
│ │ │ │ │ │ ├── image_get_all_parameters.go
│ │ │ │ │ │ ├── image_get_all_responses.go
│ │ │ │ │ │ ├── image_get_parameters.go
│ │ │ │ │ │ ├── image_get_responses.go
│ │ │ │ │ │ ├── image_history_parameters.go
│ │ │ │ │ │ ├── image_history_responses.go
│ │ │ │ │ │ ├── image_inspect_parameters.go
│ │ │ │ │ │ ├── image_inspect_responses.go
│ │ │ │ │ │ ├── image_list_parameters.go
│ │ │ │ │ │ ├── image_list_responses.go
│ │ │ │ │ │ ├── image_load_parameters.go
│ │ │ │ │ │ ├── image_load_responses.go
│ │ │ │ │ │ ├── image_prune_parameters.go
│ │ │ │ │ │ ├── image_prune_responses.go
│ │ │ │ │ │ ├── image_push_parameters.go
│ │ │ │ │ │ ├── image_push_responses.go
│ │ │ │ │ │ ├── image_search_parameters.go
│ │ │ │ │ │ ├── image_search_responses.go
│ │ │ │ │ │ ├── image_tag_parameters.go
│ │ │ │ │ │ ├── image_tag_responses.go
│ │ │ │ │ │ └── images_compat_client.go
│ │ │ │ │ ├── manifests
│ │ │ │ │ │ ├── manifest_add_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_add_libpod_responses.go
│ │ │ │ │ │ ├── manifest_create_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_create_libpod_responses.go
│ │ │ │ │ │ ├── manifest_delete_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_delete_libpod_responses.go
│ │ │ │ │ │ ├── manifest_exists_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_exists_libpod_responses.go
│ │ │ │ │ │ ├── manifest_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_inspect_libpod_responses.go
│ │ │ │ │ │ ├── manifest_modify_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_modify_libpod_responses.go
│ │ │ │ │ │ ├── manifest_push_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_push_libpod_responses.go
│ │ │ │ │ │ ├── manifest_push_v3_libpod_parameters.go
│ │ │ │ │ │ ├── manifest_push_v3_libpod_responses.go
│ │ │ │ │ │ └── manifests_client.go
│ │ │ │ │ ├── networks
│ │ │ │ │ │ ├── network_connect_libpod_parameters.go
│ │ │ │ │ │ ├── network_connect_libpod_responses.go
│ │ │ │ │ │ ├── network_create_libpod_parameters.go
│ │ │ │ │ │ ├── network_create_libpod_responses.go
│ │ │ │ │ │ ├── network_delete_libpod_parameters.go
│ │ │ │ │ │ ├── network_delete_libpod_responses.go
│ │ │ │ │ │ ├── network_disconnect_libpod_parameters.go
│ │ │ │ │ │ ├── network_disconnect_libpod_responses.go
│ │ │ │ │ │ ├── network_exists_libpod_parameters.go
│ │ │ │ │ │ ├── network_exists_libpod_responses.go
│ │ │ │ │ │ ├── network_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── network_inspect_libpod_responses.go
│ │ │ │ │ │ ├── network_list_libpod_parameters.go
│ │ │ │ │ │ ├── network_list_libpod_responses.go
│ │ │ │ │ │ ├── network_prune_libpod_parameters.go
│ │ │ │ │ │ ├── network_prune_libpod_responses.go
│ │ │ │ │ │ └── networks_client.go
│ │ │ │ │ ├── networks_compat
│ │ │ │ │ │ ├── network_connect_parameters.go
│ │ │ │ │ │ ├── network_connect_responses.go
│ │ │ │ │ │ ├── network_create_parameters.go
│ │ │ │ │ │ ├── network_create_responses.go
│ │ │ │ │ │ ├── network_delete_parameters.go
│ │ │ │ │ │ ├── network_delete_responses.go
│ │ │ │ │ │ ├── network_disconnect_parameters.go
│ │ │ │ │ │ ├── network_disconnect_responses.go
│ │ │ │ │ │ ├── network_inspect_parameters.go
│ │ │ │ │ │ ├── network_inspect_responses.go
│ │ │ │ │ │ ├── network_list_parameters.go
│ │ │ │ │ │ ├── network_list_responses.go
│ │ │ │ │ │ ├── network_prune_parameters.go
│ │ │ │ │ │ ├── network_prune_responses.go
│ │ │ │ │ │ └── networks_compat_client.go
│ │ │ │ │ ├── pods
│ │ │ │ │ │ ├── pod_create_libpod_parameters.go
│ │ │ │ │ │ ├── pod_create_libpod_responses.go
│ │ │ │ │ │ ├── pod_delete_libpod_parameters.go
│ │ │ │ │ │ ├── pod_delete_libpod_responses.go
│ │ │ │ │ │ ├── pod_exists_libpod_parameters.go
│ │ │ │ │ │ ├── pod_exists_libpod_responses.go
│ │ │ │ │ │ ├── pod_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── pod_inspect_libpod_responses.go
│ │ │ │ │ │ ├── pod_kill_libpod_parameters.go
│ │ │ │ │ │ ├── pod_kill_libpod_responses.go
│ │ │ │ │ │ ├── pod_list_libpod_parameters.go
│ │ │ │ │ │ ├── pod_list_libpod_responses.go
│ │ │ │ │ │ ├── pod_pause_libpod_parameters.go
│ │ │ │ │ │ ├── pod_pause_libpod_responses.go
│ │ │ │ │ │ ├── pod_prune_libpod_parameters.go
│ │ │ │ │ │ ├── pod_prune_libpod_responses.go
│ │ │ │ │ │ ├── pod_restart_libpod_parameters.go
│ │ │ │ │ │ ├── pod_restart_libpod_responses.go
│ │ │ │ │ │ ├── pod_start_libpod_parameters.go
│ │ │ │ │ │ ├── pod_start_libpod_responses.go
│ │ │ │ │ │ ├── pod_stats_all_libpod_parameters.go
│ │ │ │ │ │ ├── pod_stats_all_libpod_responses.go
│ │ │ │ │ │ ├── pod_stop_libpod_parameters.go
│ │ │ │ │ │ ├── pod_stop_libpod_responses.go
│ │ │ │ │ │ ├── pod_top_libpod_parameters.go
│ │ │ │ │ │ ├── pod_top_libpod_responses.go
│ │ │ │ │ │ ├── pod_unpause_libpod_parameters.go
│ │ │ │ │ │ ├── pod_unpause_libpod_responses.go
│ │ │ │ │ │ └── pods_client.go
│ │ │ │ │ ├── provides_an_api_for_the_libpod_library_client.go
│ │ │ │ │ ├── secrets
│ │ │ │ │ │ ├── secret_create_libpod_parameters.go
│ │ │ │ │ │ ├── secret_create_libpod_responses.go
│ │ │ │ │ │ ├── secret_delete_libpod_parameters.go
│ │ │ │ │ │ ├── secret_delete_libpod_responses.go
│ │ │ │ │ │ ├── secret_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── secret_inspect_libpod_responses.go
│ │ │ │ │ │ ├── secret_list_libpod_parameters.go
│ │ │ │ │ │ ├── secret_list_libpod_responses.go
│ │ │ │ │ │ └── secrets_client.go
│ │ │ │ │ ├── secrets_compat
│ │ │ │ │ │ ├── secret_create_parameters.go
│ │ │ │ │ │ ├── secret_create_responses.go
│ │ │ │ │ │ ├── secret_delete_parameters.go
│ │ │ │ │ │ ├── secret_delete_responses.go
│ │ │ │ │ │ ├── secret_inspect_parameters.go
│ │ │ │ │ │ ├── secret_inspect_responses.go
│ │ │ │ │ │ ├── secret_list_parameters.go
│ │ │ │ │ │ ├── secret_list_responses.go
│ │ │ │ │ │ └── secrets_compat_client.go
│ │ │ │ │ ├── system
│ │ │ │ │ │ ├── system_client.go
│ │ │ │ │ │ ├── system_data_usage_libpod_parameters.go
│ │ │ │ │ │ ├── system_data_usage_libpod_responses.go
│ │ │ │ │ │ ├── system_events_libpod_parameters.go
│ │ │ │ │ │ ├── system_events_libpod_responses.go
│ │ │ │ │ │ ├── system_info_libpod_parameters.go
│ │ │ │ │ │ ├── system_info_libpod_responses.go
│ │ │ │ │ │ ├── system_prune_libpod_parameters.go
│ │ │ │ │ │ ├── system_prune_libpod_responses.go
│ │ │ │ │ │ ├── system_version_libpod_parameters.go
│ │ │ │ │ │ └── system_version_libpod_responses.go
│ │ │ │ │ ├── system_compat
│ │ │ │ │ │ ├── system_auth_parameters.go
│ │ │ │ │ │ ├── system_auth_responses.go
│ │ │ │ │ │ ├── system_compat_client.go
│ │ │ │ │ │ ├── system_data_usage_parameters.go
│ │ │ │ │ │ ├── system_data_usage_responses.go
│ │ │ │ │ │ ├── system_events_parameters.go
│ │ │ │ │ │ ├── system_events_responses.go
│ │ │ │ │ │ ├── system_info_parameters.go
│ │ │ │ │ │ ├── system_info_responses.go
│ │ │ │ │ │ ├── system_ping_parameters.go
│ │ │ │ │ │ ├── system_ping_responses.go
│ │ │ │ │ │ ├── system_version_parameters.go
│ │ │ │ │ │ └── system_version_responses.go
│ │ │ │ │ ├── volumes
│ │ │ │ │ │ ├── volume_create_libpod_parameters.go
│ │ │ │ │ │ ├── volume_create_libpod_responses.go
│ │ │ │ │ │ ├── volume_delete_libpod_parameters.go
│ │ │ │ │ │ ├── volume_delete_libpod_responses.go
│ │ │ │ │ │ ├── volume_exists_libpod_parameters.go
│ │ │ │ │ │ ├── volume_exists_libpod_responses.go
│ │ │ │ │ │ ├── volume_inspect_libpod_parameters.go
│ │ │ │ │ │ ├── volume_inspect_libpod_responses.go
│ │ │ │ │ │ ├── volume_list_libpod_parameters.go
│ │ │ │ │ │ ├── volume_list_libpod_responses.go
│ │ │ │ │ │ ├── volume_prune_libpod_parameters.go
│ │ │ │ │ │ ├── volume_prune_libpod_responses.go
│ │ │ │ │ │ └── volumes_client.go
│ │ │ │ │ └── volumes_compat
│ │ │ │ │ │ ├── volume_create_parameters.go
│ │ │ │ │ │ ├── volume_create_responses.go
│ │ │ │ │ │ ├── volume_delete_parameters.go
│ │ │ │ │ │ ├── volume_delete_responses.go
│ │ │ │ │ │ ├── volume_inspect_parameters.go
│ │ │ │ │ │ ├── volume_inspect_responses.go
│ │ │ │ │ │ ├── volume_list_parameters.go
│ │ │ │ │ │ ├── volume_list_responses.go
│ │ │ │ │ │ ├── volume_prune_parameters.go
│ │ │ │ │ │ ├── volume_prune_responses.go
│ │ │ │ │ │ └── volumes_compat_client.go
│ │ │ │ │ └── models
│ │ │ │ │ ├── address.go
│ │ │ │ │ ├── auth_config.go
│ │ │ │ │ ├── authenticate_o_k_body.go
│ │ │ │ │ ├── auto_user_ns_options.go
│ │ │ │ │ ├── bind_options.go
│ │ │ │ │ ├── cgroup_spec.go
│ │ │ │ │ ├── cgroupns_mode.go
│ │ │ │ │ ├── component_version.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── config_reference.go
│ │ │ │ │ ├── conmon_info.go
│ │ │ │ │ ├── consistency.go
│ │ │ │ │ ├── container_basic_config.go
│ │ │ │ │ ├── container_cgroup_config.go
│ │ │ │ │ ├── container_change_response_item.go
│ │ │ │ │ ├── container_create_created_body.go
│ │ │ │ │ ├── container_health_check_config.go
│ │ │ │ │ ├── container_network_config.go
│ │ │ │ │ ├── container_node.go
│ │ │ │ │ ├── container_resource_config.go
│ │ │ │ │ ├── container_security_config.go
│ │ │ │ │ ├── container_size.go
│ │ │ │ │ ├── container_state.go
│ │ │ │ │ ├── container_storage_config.go
│ │ │ │ │ ├── container_store.go
│ │ │ │ │ ├── container_top_o_k_body.go
│ │ │ │ │ ├── container_update_o_k_body.go
│ │ │ │ │ ├── container_wait_o_k_body.go
│ │ │ │ │ ├── container_wait_o_k_body_error.go
│ │ │ │ │ ├── containers_prune_report.go
│ │ │ │ │ ├── create_container_config.go
│ │ │ │ │ ├── device_mapping.go
│ │ │ │ │ ├── device_request.go
│ │ │ │ │ ├── digest.go
│ │ │ │ │ ├── distribution_info.go
│ │ │ │ │ ├── docker_volume_create.go
│ │ │ │ │ ├── driver.go
│ │ │ │ │ ├── driver_data.go
│ │ │ │ │ ├── duration.go
│ │ │ │ │ ├── endpoint_ip_a_m_config.go
│ │ │ │ │ ├── endpoint_resource.go
│ │ │ │ │ ├── endpoint_settings.go
│ │ │ │ │ ├── error_response.go
│ │ │ │ │ ├── file_mode.go
│ │ │ │ │ ├── graph_driver_data.go
│ │ │ │ │ ├── hardware_addr.go
│ │ │ │ │ ├── health.go
│ │ │ │ │ ├── health_check_log.go
│ │ │ │ │ ├── health_check_results.go
│ │ │ │ │ ├── health_config.go
│ │ │ │ │ ├── healthcheck_result.go
│ │ │ │ │ ├── history.go
│ │ │ │ │ ├── history_response_item.go
│ │ │ │ │ ├── host_config.go
│ │ │ │ │ ├── host_info.go
│ │ │ │ │ ├── id_map.go
│ │ │ │ │ ├── id_mapping_options.go
│ │ │ │ │ ├── id_mappings.go
│ │ │ │ │ ├── id_response.go
│ │ │ │ │ ├── image_config.go
│ │ │ │ │ ├── image_delete_response_item.go
│ │ │ │ │ ├── image_import_report.go
│ │ │ │ │ ├── image_load_report.go
│ │ │ │ │ ├── image_metadata.go
│ │ │ │ │ ├── image_store.go
│ │ │ │ │ ├── image_summary.go
│ │ │ │ │ ├── image_volume.go
│ │ │ │ │ ├── info.go
│ │ │ │ │ ├── inspect_additional_network.go
│ │ │ │ │ ├── inspect_blkio_throttle_device.go
│ │ │ │ │ ├── inspect_blkio_weight_device.go
│ │ │ │ │ ├── inspect_container_config.go
│ │ │ │ │ ├── inspect_container_host_config.go
│ │ │ │ │ ├── inspect_container_state.go
│ │ │ │ │ ├── inspect_device.go
│ │ │ │ │ ├── inspect_host_port.go
│ │ │ │ │ ├── inspect_id_mappings.go
│ │ │ │ │ ├── inspect_log_config.go
│ │ │ │ │ ├── inspect_mount.go
│ │ │ │ │ ├── inspect_network_settings.go
│ │ │ │ │ ├── inspect_pod_container_info.go
│ │ │ │ │ ├── inspect_pod_infra_config.go
│ │ │ │ │ ├── inspect_restart_policy.go
│ │ │ │ │ ├── inspect_secret.go
│ │ │ │ │ ├── inspect_ulimit.go
│ │ │ │ │ ├── ip.go
│ │ │ │ │ ├── ip_a_m.go
│ │ │ │ │ ├── ip_a_m_config.go
│ │ │ │ │ ├── ip_mask.go
│ │ │ │ │ ├── ip_net.go
│ │ │ │ │ ├── ipc_mode.go
│ │ │ │ │ ├── isolation.go
│ │ │ │ │ ├── lease_range.go
│ │ │ │ │ ├── libpod_containers_prune_report.go
│ │ │ │ │ ├── libpod_containers_rm_report.go
│ │ │ │ │ ├── libpod_image_summary.go
│ │ │ │ │ ├── libpod_images_pull_report.go
│ │ │ │ │ ├── libpod_images_remove_report.go
│ │ │ │ │ ├── linux_block_i_o.go
│ │ │ │ │ ├── linux_block_i_o_device.go
│ │ │ │ │ ├── linux_cpu.go
│ │ │ │ │ ├── linux_device.go
│ │ │ │ │ ├── linux_device_cgroup.go
│ │ │ │ │ ├── linux_hugepage_limit.go
│ │ │ │ │ ├── linux_interface_priority.go
│ │ │ │ │ ├── linux_memory.go
│ │ │ │ │ ├── linux_network.go
│ │ │ │ │ ├── linux_personality.go
│ │ │ │ │ ├── linux_personality_domain.go
│ │ │ │ │ ├── linux_personality_flag.go
│ │ │ │ │ ├── linux_pids.go
│ │ │ │ │ ├── linux_rdma.go
│ │ │ │ │ ├── linux_resources.go
│ │ │ │ │ ├── linux_throttle_device.go
│ │ │ │ │ ├── linux_weight_device.go
│ │ │ │ │ ├── list_container.go
│ │ │ │ │ ├── list_container_namespaces.go
│ │ │ │ │ ├── list_pod_container.go
│ │ │ │ │ ├── list_pods_report.go
│ │ │ │ │ ├── log_config.go
│ │ │ │ │ ├── mac_address.go
│ │ │ │ │ ├── manifest_add_options.go
│ │ │ │ │ ├── manifest_annotate_options.go
│ │ │ │ │ ├── manifest_modify_options.go
│ │ │ │ │ ├── manifest_modify_report.go
│ │ │ │ │ ├── manifest_remove_options.go
│ │ │ │ │ ├── mount.go
│ │ │ │ │ ├── mount_point.go
│ │ │ │ │ ├── named_volume.go
│ │ │ │ │ ├── namespace.go
│ │ │ │ │ ├── namespace_mode.go
│ │ │ │ │ ├── net_options.go
│ │ │ │ │ ├── network.go
│ │ │ │ │ ├── network_connect.go
│ │ │ │ │ ├── network_connect_options.go
│ │ │ │ │ ├── network_create.go
│ │ │ │ │ ├── network_create_request.go
│ │ │ │ │ ├── network_disconnect.go
│ │ │ │ │ ├── network_mode.go
│ │ │ │ │ ├── network_prune_report.go
│ │ │ │ │ ├── network_resource.go
│ │ │ │ │ ├── network_rm_report.go
│ │ │ │ │ ├── network_settings.go
│ │ │ │ │ ├── networking_config.go
│ │ │ │ │ ├── o_c_i_runtime_info.go
│ │ │ │ │ ├── overlay_volume.go
│ │ │ │ │ ├── p_o_s_i_x_rlimit.go
│ │ │ │ │ ├── peer_info.go
│ │ │ │ │ ├── per_network_options.go
│ │ │ │ │ ├── pid_mode.go
│ │ │ │ │ ├── play_kube_pod.go
│ │ │ │ │ ├── play_kube_report.go
│ │ │ │ │ ├── play_kube_volume.go
│ │ │ │ │ ├── plugin.go
│ │ │ │ │ ├── plugin_config.go
│ │ │ │ │ ├── plugin_config_args.go
│ │ │ │ │ ├── plugin_config_interface.go
│ │ │ │ │ ├── plugin_config_linux_swagger.go
│ │ │ │ │ ├── plugin_config_network.go
│ │ │ │ │ ├── plugin_config_rootfs.go
│ │ │ │ │ ├── plugin_config_user.go
│ │ │ │ │ ├── plugin_device.go
│ │ │ │ │ ├── plugin_env.go
│ │ │ │ │ ├── plugin_interface_type.go
│ │ │ │ │ ├── plugin_mount.go
│ │ │ │ │ ├── plugin_settings.go
│ │ │ │ │ ├── plugins.go
│ │ │ │ │ ├── pod_basic_config.go
│ │ │ │ │ ├── pod_cgroup_config.go
│ │ │ │ │ ├── pod_create_config.go
│ │ │ │ │ ├── pod_create_options.go
│ │ │ │ │ ├── pod_kill_report.go
│ │ │ │ │ ├── pod_network_config.go
│ │ │ │ │ ├── pod_pause_report.go
│ │ │ │ │ ├── pod_prune_report.go
│ │ │ │ │ ├── pod_resource_config.go
│ │ │ │ │ ├── pod_restart_report.go
│ │ │ │ │ ├── pod_rm_report.go
│ │ │ │ │ ├── pod_security_config.go
│ │ │ │ │ ├── pod_spec_generator.go
│ │ │ │ │ ├── pod_start_report.go
│ │ │ │ │ ├── pod_stop_report.go
│ │ │ │ │ ├── pod_storage_config.go
│ │ │ │ │ ├── pod_unpause_report.go
│ │ │ │ │ ├── port.go
│ │ │ │ │ ├── port_binding.go
│ │ │ │ │ ├── port_map.go
│ │ │ │ │ ├── port_mapping.go
│ │ │ │ │ ├── port_set.go
│ │ │ │ │ ├── propagation.go
│ │ │ │ │ ├── prune_report.go
│ │ │ │ │ ├── remote_socket.go
│ │ │ │ │ ├── resources.go
│ │ │ │ │ ├── restart_policy.go
│ │ │ │ │ ├── root_f_s.go
│ │ │ │ │ ├── schema2_health_config.go
│ │ │ │ │ ├── schema2_list.go
│ │ │ │ │ ├── schema2_manifest_descriptor.go
│ │ │ │ │ ├── schema2_platform_spec.go
│ │ │ │ │ ├── secret.go
│ │ │ │ │ ├── secret_create_request.go
│ │ │ │ │ ├── secret_driver_spec.go
│ │ │ │ │ ├── secret_info_report.go
│ │ │ │ │ ├── secret_info_report_compat.go
│ │ │ │ │ ├── secret_spec.go
│ │ │ │ │ ├── secret_version.go
│ │ │ │ │ ├── security_info.go
│ │ │ │ │ ├── service_info.go
│ │ │ │ │ ├── service_update_response.go
│ │ │ │ │ ├── signal.go
│ │ │ │ │ ├── slirp_info.go
│ │ │ │ │ ├── spec_generator.go
│ │ │ │ │ ├── store_info.go
│ │ │ │ │ ├── str_slice.go
│ │ │ │ │ ├── subnet.go
│ │ │ │ │ ├── swag_compat_network_connect_request.go
│ │ │ │ │ ├── swag_compat_network_disconnect_request.go
│ │ │ │ │ ├── swag_network_connect_request.go
│ │ │ │ │ ├── swag_network_create_libpod.go
│ │ │ │ │ ├── system_df_container_report.go
│ │ │ │ │ ├── system_df_image_report.go
│ │ │ │ │ ├── system_df_volume_report.go
│ │ │ │ │ ├── task.go
│ │ │ │ │ ├── throttle_device.go
│ │ │ │ │ ├── tmpfs_options.go
│ │ │ │ │ ├── type.go
│ │ │ │ │ ├── u_t_s_mode.go
│ │ │ │ │ ├── ulimit.go
│ │ │ │ │ ├── userns_mode.go
│ │ │ │ │ ├── version.go
│ │ │ │ │ ├── volume.go
│ │ │ │ │ ├── volume_config_response.go
│ │ │ │ │ ├── volume_create_body.go
│ │ │ │ │ ├── volume_create_options.go
│ │ │ │ │ ├── volume_list_body.go
│ │ │ │ │ ├── volume_list_o_k_body.go
│ │ │ │ │ ├── volume_options.go
│ │ │ │ │ ├── volume_usage_data.go
│ │ │ │ │ └── weight_device.go
│ │ │ ├── labels.go
│ │ │ ├── labels_test.go
│ │ │ ├── network_status.go
│ │ │ ├── podman
│ │ │ │ ├── container.go
│ │ │ │ ├── container_mock.go
│ │ │ │ ├── container_test.go
│ │ │ │ ├── image.go
│ │ │ │ ├── informer.go
│ │ │ │ ├── informer_test.go
│ │ │ │ ├── network.go
│ │ │ │ ├── rest.go
│ │ │ │ ├── rest_test.go
│ │ │ │ ├── version.go
│ │ │ │ ├── volume.go
│ │ │ │ └── volume_test.go
│ │ │ ├── policy_validator.go
│ │ │ ├── policy_validator_mock_test.go
│ │ │ ├── revoke_all.go
│ │ │ ├── revoke_all_test.go
│ │ │ ├── router_create.go
│ │ │ ├── router_create_test.go
│ │ │ ├── router_inspect.go
│ │ │ ├── router_remove.go
│ │ │ ├── router_update.go
│ │ │ ├── serviceinterface_create.go
│ │ │ ├── serviceinterface_create_test.go
│ │ │ ├── serviceinterface_inspect.go
│ │ │ ├── serviceinterface_inspect_test.go
│ │ │ ├── serviceinterface_list.go
│ │ │ ├── serviceinterface_remove.go
│ │ │ ├── serviceinterface_remove_test.go
│ │ │ ├── serviceinterface_update.go
│ │ │ ├── serviceinterface_update_test.go
│ │ │ ├── site_config_create.go
│ │ │ ├── site_config_inspect.go
│ │ │ ├── site_config_remove.go
│ │ │ ├── site_config_test.go
│ │ │ ├── site_config_update.go
│ │ │ ├── token_claim_create.go
│ │ │ ├── token_claim_create_test.go
│ │ │ ├── utils.go
│ │ │ └── utils_test.go
│ │ ├── pkg
│ │ │ ├── apis
│ │ │ │ └── skupper
│ │ │ │ │ ├── register.go
│ │ │ │ │ └── v1alpha1
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── register.go
│ │ │ │ │ ├── types.go
│ │ │ │ │ └── zz_generated.deepcopy.go
│ │ │ ├── certs
│ │ │ │ └── certs.go
│ │ │ ├── cleanhttp
│ │ │ │ └── cleanhttp.go
│ │ │ ├── config
│ │ │ │ ├── local.go
│ │ │ │ ├── local_test.go
│ │ │ │ ├── prometheus-web-config.yml.template
│ │ │ │ ├── prometheus.go
│ │ │ │ ├── prometheus.yml.template
│ │ │ │ ├── startsh-podman.template
│ │ │ │ ├── startup.go
│ │ │ │ ├── stopsh-podman.template
│ │ │ │ ├── systemd.go
│ │ │ │ └── systemd_service.template
│ │ │ ├── data
│ │ │ │ ├── http.go
│ │ │ │ ├── http_test.go
│ │ │ │ ├── query.go
│ │ │ │ ├── query_test.go
│ │ │ │ ├── service.go
│ │ │ │ ├── site.go
│ │ │ │ ├── tcp.go
│ │ │ │ └── tcp_test.go
│ │ │ ├── domain
│ │ │ │ ├── egress.go
│ │ │ │ ├── ingress.go
│ │ │ │ ├── kube
│ │ │ │ │ └── link_kube.go
│ │ │ │ ├── link.go
│ │ │ │ ├── podman
│ │ │ │ │ ├── common.go
│ │ │ │ │ ├── component.go
│ │ │ │ │ ├── controller
│ │ │ │ │ │ ├── controller.go
│ │ │ │ │ │ └── site_beacons.go
│ │ │ │ │ ├── credential_handler.go
│ │ │ │ │ ├── credential_handler_test.go
│ │ │ │ │ ├── deployment.go
│ │ │ │ │ ├── ingress.go
│ │ │ │ │ ├── link.go
│ │ │ │ │ ├── link_test.go
│ │ │ │ │ ├── local_config.go
│ │ │ │ │ ├── main_test.go
│ │ │ │ │ ├── network_status.go
│ │ │ │ │ ├── network_status_sample_data.json
│ │ │ │ │ ├── network_status_test.go
│ │ │ │ │ ├── router.go
│ │ │ │ │ ├── router_config_handler.go
│ │ │ │ │ ├── router_config_handler_test.go
│ │ │ │ │ ├── service.go
│ │ │ │ │ ├── service_test.go
│ │ │ │ │ ├── site.go
│ │ │ │ │ ├── site_test.go
│ │ │ │ │ ├── skrouterd.json
│ │ │ │ │ ├── skupper-services.json
│ │ │ │ │ ├── token.go
│ │ │ │ │ ├── token_test.go
│ │ │ │ │ ├── update_common.go
│ │ │ │ │ ├── update_common_test.go
│ │ │ │ │ ├── update_v1_5_4_test.go
│ │ │ │ │ └── update_v1_6_0.go
│ │ │ │ ├── router.go
│ │ │ │ ├── service.go
│ │ │ │ ├── site.go
│ │ │ │ ├── skupper_component.go
│ │ │ │ ├── skupper_deployment.go
│ │ │ │ ├── token.go
│ │ │ │ ├── update.go
│ │ │ │ └── update_test.go
│ │ │ ├── event
│ │ │ │ ├── event.go
│ │ │ │ └── event_test.go
│ │ │ ├── flow
│ │ │ │ ├── collector.go
│ │ │ │ ├── collector_test.go
│ │ │ │ ├── controller.go
│ │ │ │ ├── controller_test.go
│ │ │ │ ├── encoding.go
│ │ │ │ ├── encoding_test.go
│ │ │ │ ├── flow_mem_driver.go
│ │ │ │ ├── flow_mem_driver_test.go
│ │ │ │ ├── messaging.go
│ │ │ │ ├── record.go
│ │ │ │ └── record_test.go
│ │ │ ├── fs
│ │ │ │ └── watcher.go
│ │ │ ├── generated
│ │ │ │ └── client
│ │ │ │ │ ├── clientset
│ │ │ │ │ └── versioned
│ │ │ │ │ │ ├── clientset.go
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ ├── fake
│ │ │ │ │ │ ├── clientset_generated.go
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ └── register.go
│ │ │ │ │ │ ├── scheme
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ └── register.go
│ │ │ │ │ │ └── typed
│ │ │ │ │ │ └── skupper
│ │ │ │ │ │ └── v1alpha1
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ ├── fake
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ ├── fake_skupper_client.go
│ │ │ │ │ │ └── fake_skupperclusterpolicy.go
│ │ │ │ │ │ ├── generated_expansion.go
│ │ │ │ │ │ ├── skupper_client.go
│ │ │ │ │ │ └── skupperclusterpolicy.go
│ │ │ │ │ ├── informers
│ │ │ │ │ └── externalversions
│ │ │ │ │ │ ├── factory.go
│ │ │ │ │ │ ├── generic.go
│ │ │ │ │ │ ├── internalinterfaces
│ │ │ │ │ │ └── factory_interfaces.go
│ │ │ │ │ │ └── skupper
│ │ │ │ │ │ ├── interface.go
│ │ │ │ │ │ └── v1alpha1
│ │ │ │ │ │ ├── interface.go
│ │ │ │ │ │ └── skupperclusterpolicy.go
│ │ │ │ │ └── listers
│ │ │ │ │ └── skupper
│ │ │ │ │ └── v1alpha1
│ │ │ │ │ ├── expansion_generated.go
│ │ │ │ │ └── skupperclusterpolicy.go
│ │ │ ├── images
│ │ │ │ ├── image_utils.go
│ │ │ │ └── images.go
│ │ │ ├── kube
│ │ │ │ ├── claims
│ │ │ │ │ ├── claim_create.go
│ │ │ │ │ ├── claim_create_test.go
│ │ │ │ │ ├── claim_verifier.go
│ │ │ │ │ └── claim_verifier_test.go
│ │ │ │ ├── clients.go
│ │ │ │ ├── clusterrolebindings.go
│ │ │ │ ├── clusterroles.go
│ │ │ │ ├── configmaps.go
│ │ │ │ ├── configmaps_test.go
│ │ │ │ ├── containers.go
│ │ │ │ ├── contour.go
│ │ │ │ ├── deploymentconfigs.go
│ │ │ │ ├── deployments.go
│ │ │ │ ├── deployments_test.go
│ │ │ │ ├── envvars.go
│ │ │ │ ├── events.go
│ │ │ │ ├── exec_util.go
│ │ │ │ ├── externalbridge.go
│ │ │ │ ├── ingress.go
│ │ │ │ ├── misc.go
│ │ │ │ ├── namespaces.go
│ │ │ │ ├── networkpolicies.go
│ │ │ │ ├── pods.go
│ │ │ │ ├── podtargetresolver.go
│ │ │ │ ├── qdr
│ │ │ │ │ ├── mgmt.go
│ │ │ │ │ ├── ssl_profile.go
│ │ │ │ │ ├── tls_handler.go
│ │ │ │ │ └── tls_handler_test.go
│ │ │ │ ├── resolver
│ │ │ │ │ ├── contour.go
│ │ │ │ │ ├── ingress.go
│ │ │ │ │ ├── loadbalancer.go
│ │ │ │ │ ├── local.go
│ │ │ │ │ ├── nodeport.go
│ │ │ │ │ ├── resolver.go
│ │ │ │ │ └── route.go
│ │ │ │ ├── rolebindings.go
│ │ │ │ ├── roles.go
│ │ │ │ ├── routes.go
│ │ │ │ ├── secrets.go
│ │ │ │ ├── secrets_test.go
│ │ │ │ ├── serviceaccounts.go
│ │ │ │ ├── serviceingressbindings.go
│ │ │ │ ├── serviceingressbindings_test.go
│ │ │ │ ├── services.go
│ │ │ │ ├── services_test.go
│ │ │ │ ├── site
│ │ │ │ │ ├── context.go
│ │ │ │ │ └── context_test.go
│ │ │ │ └── volumes.go
│ │ │ ├── messaging
│ │ │ │ ├── messaging.go
│ │ │ │ └── mock.go
│ │ │ ├── network
│ │ │ │ ├── network.go
│ │ │ │ ├── network_test.go
│ │ │ │ └── types.go
│ │ │ ├── qdr
│ │ │ │ ├── amqp_mgmt.go
│ │ │ │ ├── amqp_mgmt_mock_test.go
│ │ │ │ ├── messaging.go
│ │ │ │ ├── qdr.go
│ │ │ │ ├── qdr_test.go
│ │ │ │ ├── request.go
│ │ │ │ ├── router_logging.go
│ │ │ │ ├── router_logging_test.go
│ │ │ │ └── skmanage.go
│ │ │ ├── service
│ │ │ │ ├── bindings.go
│ │ │ │ └── bindings_test.go
│ │ │ ├── service_sync
│ │ │ │ ├── encoding.go
│ │ │ │ ├── encoding_test.go
│ │ │ │ ├── messaging.go
│ │ │ │ ├── messaging_test.go
│ │ │ │ ├── service_sync.go
│ │ │ │ └── service_sync_test.go
│ │ │ ├── site
│ │ │ │ └── site.go
│ │ │ ├── utils
│ │ │ │ ├── configs
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── manifest.go
│ │ │ │ │ └── manifest_test.go
│ │ │ │ ├── formatter
│ │ │ │ │ ├── list.go
│ │ │ │ │ ├── map.go
│ │ │ │ │ └── status.go
│ │ │ │ ├── retry.go
│ │ │ │ ├── retry_test.go
│ │ │ │ ├── spinner.go
│ │ │ │ ├── tcp.go
│ │ │ │ ├── tcp_test.go
│ │ │ │ ├── tlscfg
│ │ │ │ │ └── tls.go
│ │ │ │ ├── utils.go
│ │ │ │ ├── utils_test.go
│ │ │ │ ├── validator
│ │ │ │ │ ├── simple_validator.go
│ │ │ │ │ └── simple_validator_test.go
│ │ │ │ ├── version.go
│ │ │ │ └── version_test.go
│ │ │ └── version
│ │ │ │ └── version.go
│ │ ├── skupper_methods.go
│ │ └── test
│ │ │ └── utils
│ │ │ ├── base
│ │ │ ├── cluster_context.go
│ │ │ ├── cluster_test_runner.go
│ │ │ ├── cluster_test_runner_test.go
│ │ │ ├── env.go
│ │ │ ├── flag.go
│ │ │ ├── interrupt_handler.go
│ │ │ ├── kubeconfig.go
│ │ │ ├── kubeconfig_test.go
│ │ │ ├── skupper.go
│ │ │ └── test_common.go
│ │ │ ├── constants
│ │ │ └── constants.go
│ │ │ ├── env
│ │ │ └── envvars.go
│ │ │ ├── k8s
│ │ │ ├── deployment.go
│ │ │ ├── execute.go
│ │ │ ├── job.go
│ │ │ ├── namespace.go
│ │ │ ├── pod.go
│ │ │ ├── service.go
│ │ │ ├── service_test.go
│ │ │ └── yaml.go
│ │ │ ├── string.go
│ │ │ └── tools
│ │ │ └── curl.go
│ └── utils
│ │ └── skupper
│ │ └── util.go
├── pkg
│ ├── .keep
│ ├── apis
│ │ ├── apis.go
│ │ ├── interconnect
│ │ │ └── v1alpha1
│ │ │ │ ├── cluster.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── link.go
│ │ │ │ ├── register.go
│ │ │ │ ├── service.go
│ │ │ │ └── zz_generated.deepcopy.go
│ │ └── network
│ │ │ └── v1alpha1
│ │ │ ├── doc.go
│ │ │ ├── network.go
│ │ │ ├── networkcluster.go
│ │ │ ├── networklink.go
│ │ │ ├── networkservice.go
│ │ │ ├── register.go
│ │ │ └── zz_generated.deepcopy.go
│ ├── clientset
│ │ └── versioned
│ │ │ ├── clientset.go
│ │ │ ├── fake
│ │ │ ├── clientset_generated.go
│ │ │ ├── doc.go
│ │ │ └── register.go
│ │ │ ├── scheme
│ │ │ ├── doc.go
│ │ │ └── register.go
│ │ │ └── typed
│ │ │ ├── interconnect
│ │ │ └── v1alpha1
│ │ │ │ ├── cluster.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── fake
│ │ │ │ ├── doc.go
│ │ │ │ ├── fake_cluster.go
│ │ │ │ ├── fake_interconnect_client.go
│ │ │ │ ├── fake_link.go
│ │ │ │ └── fake_service.go
│ │ │ │ ├── generated_expansion.go
│ │ │ │ ├── interconnect_client.go
│ │ │ │ ├── link.go
│ │ │ │ └── service.go
│ │ │ └── network
│ │ │ └── v1alpha1
│ │ │ ├── doc.go
│ │ │ ├── fake
│ │ │ ├── doc.go
│ │ │ ├── fake_network.go
│ │ │ ├── fake_network_client.go
│ │ │ ├── fake_networkcluster.go
│ │ │ ├── fake_networklink.go
│ │ │ └── fake_networkservice.go
│ │ │ ├── generated_expansion.go
│ │ │ ├── network.go
│ │ │ ├── network_client.go
│ │ │ ├── networkcluster.go
│ │ │ ├── networklink.go
│ │ │ └── networkservice.go
│ ├── informers
│ │ └── externalversions
│ │ │ ├── factory.go
│ │ │ ├── generic.go
│ │ │ ├── interconnect
│ │ │ ├── interface.go
│ │ │ └── v1alpha1
│ │ │ │ ├── cluster.go
│ │ │ │ ├── interface.go
│ │ │ │ ├── link.go
│ │ │ │ └── service.go
│ │ │ ├── internalinterfaces
│ │ │ └── factory_interfaces.go
│ │ │ └── network
│ │ │ ├── interface.go
│ │ │ └── v1alpha1
│ │ │ ├── interface.go
│ │ │ ├── network.go
│ │ │ ├── networkcluster.go
│ │ │ ├── networklink.go
│ │ │ └── networkservice.go
│ └── listers
│ │ ├── interconnect
│ │ └── v1alpha1
│ │ │ ├── cluster.go
│ │ │ ├── expansion_generated.go
│ │ │ ├── link.go
│ │ │ └── service.go
│ │ └── network
│ │ └── v1alpha1
│ │ ├── expansion_generated.go
│ │ ├── network.go
│ │ ├── networkcluster.go
│ │ ├── networklink.go
│ │ └── networkservice.go
├── requirements.txt
└── test
│ └── e2e
│ └── data
│ ├── cluster
│ ├── cluster-001.yaml
│ ├── cluster-002.yaml
│ ├── cluster-003.yaml
│ ├── cluster-004.yaml
│ └── cluster-005.yaml
│ ├── crds
│ ├── app.orchestrator.io_clusters.yaml
│ ├── app.orchestrator.io_deploymentclusters.yaml
│ └── app.orchestrator.io_deployments.yaml
│ ├── deployment-cluster
│ ├── test-deployment-cluster-1.yaml
│ ├── test-deployment-cluster-2.yaml
│ ├── test-deployment-cluster-3.yaml
│ ├── test-deployment-cluster-4.yaml
│ └── test-deployment-cluster-5.yaml
│ ├── deployment
│ └── test-deployment.yaml
│ ├── namespace
│ ├── cluster-fleet-default-cluster-001-namespace.yaml
│ ├── cluster-fleet-default-cluster-002-namespace.yaml
│ ├── cluster-fleet-default-cluster-003-namespace.yaml
│ ├── cluster-fleet-default-cluster-004-namespace.yaml
│ ├── cluster-fleet-default-cluster-005-namespace.yaml
│ ├── fleet-default-namespace.yaml
│ ├── interconnect-namespace.yaml
│ ├── test-namespace-1.yaml
│ └── test-namespace-2.yaml
│ └── service
│ ├── test-service-cluster-1.yaml
│ └── test-service-cluster-2.yaml
├── app-resource-manager
├── .chartver.yaml
├── .gitignore
├── .golangci.yml
├── .htmllintrc
├── .markdownlintignore
├── .stylelintrc.json
├── Dockerfile
├── LICENSES
│ └── Apache-2.0.txt
├── Makefile
├── README.md
├── REUSE.toml
├── VERSION
├── api
│ ├── nbi
│ │ └── v2
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── pkg
│ │ │ └── restClient
│ │ │ │ └── v2
│ │ │ │ ├── client.go
│ │ │ │ └── types.go
│ │ │ ├── resource
│ │ │ └── v2
│ │ │ │ ├── app_workload_resource.pb.go
│ │ │ │ ├── app_workload_resource.pb.validate.go
│ │ │ │ ├── app_workload_resource.proto
│ │ │ │ ├── app_workload_service.pb.go
│ │ │ │ ├── app_workload_service.pb.gw.go
│ │ │ │ ├── app_workload_service.pb.validate.go
│ │ │ │ ├── app_workload_service.proto
│ │ │ │ ├── app_workload_service_grpc.pb.go
│ │ │ │ ├── endpoint_resource.pb.go
│ │ │ │ ├── endpoint_resource.pb.validate.go
│ │ │ │ ├── endpoint_resource.proto
│ │ │ │ ├── endpoint_service.pb.go
│ │ │ │ ├── endpoint_service.pb.gw.go
│ │ │ │ ├── endpoint_service.pb.validate.go
│ │ │ │ ├── endpoint_service.proto
│ │ │ │ ├── endpoint_service_grpc.pb.go
│ │ │ │ ├── pod_resource.pb.go
│ │ │ │ ├── pod_resource.pb.validate.go
│ │ │ │ ├── pod_resource.proto
│ │ │ │ ├── pod_service.pb.go
│ │ │ │ ├── pod_service.pb.gw.go
│ │ │ │ ├── pod_service.pb.validate.go
│ │ │ │ ├── pod_service.proto
│ │ │ │ ├── pod_service_grpc.pb.go
│ │ │ │ ├── vm_resource.pb.go
│ │ │ │ ├── vm_resource.pb.validate.go
│ │ │ │ ├── vm_resource.proto
│ │ │ │ ├── vm_service.pb.go
│ │ │ │ ├── vm_service.pb.gw.go
│ │ │ │ ├── vm_service.pb.validate.go
│ │ │ │ ├── vm_service.proto
│ │ │ │ └── vm_service_grpc.pb.go
│ │ │ └── spec
│ │ │ └── v2
│ │ │ └── openapi.yaml
│ └── spec
│ │ └── v2
│ │ └── openapi.yaml
├── buf.gen.yaml
├── buf.yaml
├── cmd
│ ├── app-resource-manager
│ │ └── main.go
│ ├── rest-proxy
│ │ └── rest-proxy.go
│ └── vnc-proxy
│ │ └── main.go
├── deployments
│ └── app-resource-manager
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── files
│ │ ├── grafana
│ │ │ └── app-resource-manager-dashboard.json
│ │ └── openpolicyagent
│ │ │ └── v2
│ │ │ ├── common.rego
│ │ │ ├── common_test.rego
│ │ │ ├── delete_pod_endpoint.rego
│ │ │ ├── delete_pod_endpoint_test.rego
│ │ │ ├── get_vnc_endpoint.rego
│ │ │ ├── get_vnc_endpoint_test.rego
│ │ │ ├── list_app_workloads_endpoint.rego
│ │ │ ├── list_app_workloads_endpoint_test.rego
│ │ │ ├── list_endpoints.rego
│ │ │ ├── list_endpoints_test.rego
│ │ │ ├── restart_vm_endpoint.rego
│ │ │ ├── restart_vm_endpoint_test.rego
│ │ │ ├── start_vm_endpoint.rego
│ │ │ ├── start_vm_endpoint_test.rego
│ │ │ ├── stop_vm_endpoint.rego
│ │ │ └── stop_vm_endpoint_test.rego
│ │ ├── templates
│ │ ├── NOTES.txt
│ │ ├── NOTES.txt.license
│ │ ├── _helpers.tpl
│ │ ├── configmap.yaml
│ │ ├── deployment-vnc-proxy.yaml
│ │ ├── deployment.yaml
│ │ ├── ingress.yaml
│ │ ├── service.yaml
│ │ ├── serviceaccount.yaml
│ │ └── tests
│ │ │ └── test-connection.yaml
│ │ └── values.yaml
├── go.mod
├── go.sum
├── grafana
│ └── app-resource-manager-dashboard.json
├── internal
│ ├── adm
│ │ ├── client.go
│ │ ├── mocks
│ │ │ └── adm_client_mock.go
│ │ └── utils.go
│ ├── kubernetes
│ │ ├── manager.go
│ │ ├── manager_test.go
│ │ ├── mocks
│ │ │ └── kubernetes_manager_mock.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── kubevirt
│ │ ├── manager.go
│ │ ├── manager_test.go
│ │ ├── mocks
│ │ │ ├── kubevirt_manager_mock.go
│ │ │ ├── kubevirtclient_mock.go
│ │ │ ├── streaminterface_mock.go
│ │ │ ├── virtualmachineinstanceinterface_mock.go
│ │ │ └── virtualmachineinterface_mock.go
│ │ ├── utils.go
│ │ ├── utils_test.go
│ │ ├── vm.go
│ │ ├── vnc.go
│ │ └── vnc_test.go
│ ├── manager
│ │ └── manager.go
│ ├── model
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── sb_vm_state.go
│ │ └── sb_vm_state_test.go
│ ├── northbound
│ │ └── services
│ │ │ └── v2
│ │ │ └── resource
│ │ │ ├── app_workload_service.go
│ │ │ ├── app_workload_service_test.go
│ │ │ ├── endpoint_service.go
│ │ │ ├── endpoint_service_test.go
│ │ │ ├── mocks
│ │ │ ├── mock_app_workload_service.go
│ │ │ ├── mock_endpoints_service.go
│ │ │ ├── mock_pod_service.go
│ │ │ └── mock_vm_service.go
│ │ │ ├── pod_service.go
│ │ │ ├── pod_service_test.go
│ │ │ ├── service.go
│ │ │ ├── service_test.go
│ │ │ ├── utils.go
│ │ │ ├── vm_service.go
│ │ │ ├── vm_service_fuzz_test.go
│ │ │ └── vm_service_test.go
│ ├── opa
│ │ ├── opa.go
│ │ └── opa_test.go
│ ├── restproxy
│ │ ├── rest-proxy.go
│ │ └── rest_gateway_fuzz_test.go
│ ├── southbound
│ │ ├── handler.go
│ │ ├── handler_test.go
│ │ └── mocks
│ │ │ └── handler_mock.go
│ ├── utils
│ │ ├── env
│ │ │ ├── utils.go
│ │ │ └── utils_test.go
│ │ ├── k8serrors
│ │ │ ├── k8serrors.go
│ │ │ └── k8serrors_test.go
│ │ └── ratelimiter
│ │ │ ├── util.go
│ │ │ └── util_test.go
│ ├── vncproxy
│ │ ├── manager.go
│ │ └── manager_test.go
│ └── wsproxy
│ │ ├── counter.go
│ │ ├── counter_test.go
│ │ ├── forwarding.go
│ │ ├── forwarding_test.go
│ │ └── mocks
│ │ ├── counter_mock.go
│ │ ├── reader_mock.go
│ │ └── writer_mock.go
├── requirements.txt
├── set-version.sh
├── test
│ ├── configs
│ │ ├── arm_config.yaml
│ │ └── invalid_config.yaml
│ ├── container
│ │ ├── auth_test.go
│ │ ├── endpoint_test.go
│ │ ├── methods_test.go
│ │ └── suite_test.go
│ ├── template.html
│ ├── utils
│ │ └── utils.go
│ └── vm
│ │ ├── auth_test.go
│ │ ├── endpoint_test.go
│ │ ├── methods_test.go
│ │ └── suite_test.go
├── tools
│ └── tools.go
└── vnc-proxy-web-ui
│ ├── README.md
│ ├── keycloak.min.js
│ ├── rfb.js
│ ├── vnc-proxy-index.html
│ ├── vnc-proxy-main.js
│ └── vnc-proxy-styles.css
├── app-service-proxy
├── .gitignore
├── .golangci.yml
├── .htmllintrc
├── .markdownlintignore
├── .stylelintrc.json
├── Dockerfile
├── LICENSES
│ └── Apache-2.0.txt
├── Makefile
├── PROJECT
├── README.md
├── REUSE.toml
├── VERSION
├── cmd
│ └── app-service-proxy
│ │ └── main.go
├── deployments
│ └── app-service-proxy
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── files
│ │ └── openpolicyagent
│ │ │ ├── allow.rego
│ │ │ └── allow_test.rego
│ │ ├── templates
│ │ ├── NOTES.txt
│ │ ├── _helpers.tpl
│ │ ├── configmap.yaml
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── serviceaccount.yaml
│ │ └── values.yaml
├── go.mod
├── go.sum
├── hadolint.yml
├── internal
│ ├── admclient
│ │ ├── admclient.go
│ │ └── utils.go
│ ├── middleware
│ │ ├── middleware.go
│ │ ├── middleware_suite_test.go
│ │ └── middleware_test.go
│ ├── rbac
│ │ └── rbac.go
│ └── server
│ │ ├── fuzztests
│ │ └── server_fuzz_test.go
│ │ ├── server.go
│ │ ├── server_suite_test.go
│ │ ├── server_test.go
│ │ ├── transport.go
│ │ └── transport_test.go
├── requirements.txt
└── web-login
│ ├── README.md
│ ├── app-service-proxy-index.html
│ ├── app-service-proxy-keycloak.min.js
│ ├── app-service-proxy-main.js
│ └── app-service-proxy-styles.css
├── common.mk
├── requirements.txt
├── test-common-utils
├── .gitignore
├── .golangci.yml
├── LICENSES
│ └── Apache-2.0.txt
├── Makefile
├── REUSE.toml
├── VERSION
├── go.mod
├── go.sum
├── pkg
│ ├── auth
│ │ └── auth.go
│ ├── clients
│ │ └── clients.go
│ ├── deployment
│ │ └── deploy.go
│ ├── git
│ │ └── git.go
│ ├── loader
│ │ └── catalog-loader.go
│ ├── portforwarding
│ │ └── portforwarding.go
│ └── types
│ │ └── common_types.go
└── requirements.txt
├── trivy.yaml
└── version.mk
/.dockerignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | *
6 |
7 | !/common.mk
8 | !/version.mk
9 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # These owners will be the default owners for everything in the repo. Unless a
6 | # later match takes precedence, these owners will be requested for review when
7 | # someone opens a pull request.
8 |
9 | # Everything requires team review by default
10 | * @badhrinathpa @pudelkoM @cgoea @ajaythakurintel @adibrastegarnia @SeanCondon @scottmbaker @guptagunjan @sys-devops-approve
11 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ## Description
2 |
3 | Describe the purpose of this pull request.
4 |
5 | ## Changes
6 |
7 | List the changes you have made.
8 |
9 | ## Additional Information
10 |
11 | Include any additional information, such as how to test your changes.
12 |
13 | ## Checklist
14 |
15 | - [ ] Tests passed
16 | - [ ] Documentation updated
17 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | ---
5 | version: 2
6 | updates:
7 | - package-ecosystem: "gomod"
8 | directories:
9 | - "/"
10 | schedule:
11 | interval: daily
12 | open-pull-requests-limit: 10
13 | commit-message:
14 | prefix: "[gomod] "
15 | - package-ecosystem: "github-actions"
16 | directory: "/"
17 | schedule:
18 | interval: daily
19 | open-pull-requests-limit: 10
20 | commit-message:
21 | prefix: "[gha] "
22 | - package-ecosystem: "docker"
23 | directories:
24 | - "/"
25 | schedule:
26 | interval: daily
27 | open-pull-requests-limit: 10
28 | commit-message:
29 | prefix: "[docker] "
30 |
--------------------------------------------------------------------------------
/.github/workflows/adm-component-test.yml:
--------------------------------------------------------------------------------
1 | ---
2 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | name: ADM Component Tests
6 | on:
7 | pull_request:
8 | types: [labeled]
9 | schedule:
10 | - cron: "0 0 * * *" # Run every day at midnight
11 | workflow_dispatch: # Run on manual trigger
12 | inputs:
13 | run-adm:
14 | description: 'Run App Deployment Manager component tests'
15 | required: true
16 | type: boolean
17 | default: false
18 | emf-branch:
19 | description: 'The branch, tag or SHA to checkout EMF'
20 | required: true
21 | type: string
22 | default: '51d847c5b3a831454981f5fce7cecbbe1ade5e87'
23 | permissions:
24 | contents: read
25 |
26 |
27 | jobs:
28 | component-test-adm:
29 | if: ${{ inputs.run-adm || github.event_name == 'schedule' || github.event.label.name == 'run-adm-component-tests' }}
30 | name: ADM Component Test
31 | uses: ./.github/workflows/common-comp-tests.yml
32 | with:
33 | component: app-deployment-manager
34 | use-enic: true
35 | emf-branch: ${{ inputs.emf-branch || '51d847c5b3a831454981f5fce7cecbbe1ade5e87' }}
36 | secrets: inherit # zizmor: ignore[secrets-inherit]
37 |
--------------------------------------------------------------------------------
/.github/workflows/arm-component-test.yml:
--------------------------------------------------------------------------------
1 | ---
2 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | name: ARM Component Tests
6 | on:
7 | pull_request:
8 | types: [labeled]
9 | schedule:
10 | - cron: "0 0 * * *" # Run every day at midnight
11 | workflow_dispatch: # Run on manual trigger
12 | inputs:
13 | run-arm:
14 | description: 'Run App Resource Manager component tests'
15 | required: true
16 | type: boolean
17 | default: false
18 | emf-branch:
19 | description: 'The branch, tag or SHA to checkout EMF'
20 | required: true
21 | type: string
22 | default: '51d847c5b3a831454981f5fce7cecbbe1ade5e87'
23 | permissions:
24 | contents: read
25 |
26 | jobs:
27 | component-test-arm:
28 | if: ${{ inputs.run-arm || github.event_name == 'schedule' || github.event.label.name == 'run-arm-component-tests' }}
29 | name: ARM Component Test
30 | uses: ./.github/workflows/common-comp-tests.yml
31 | with:
32 | component: app-resource-manager
33 | use-enic: true
34 | emf-branch: ${{ inputs.emf-branch || '51d847c5b3a831454981f5fce7cecbbe1ade5e87' }}
35 | secrets: inherit # zizmor: ignore[secrets-inherit]
--------------------------------------------------------------------------------
/.github/workflows/auto-close.yml:
--------------------------------------------------------------------------------
1 | ---
2 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | name: Stale Pull Requests
6 |
7 | # After 30 days of no activity on a PR, the PR should be marked as stale,
8 | # a comment made on the PR informing the author of the new status,
9 | # and closed after 15 days if there is no further activity from the change to stale state.
10 | on:
11 | schedule:
12 | - cron: '30 1 * * *' # run every day
13 | workflow_dispatch: {}
14 |
15 | permissions:
16 | contents: read
17 |
18 | jobs:
19 | stale-auto-close:
20 | runs-on: ${{ github.repository_owner == 'intel' && 'intel-ubuntu-latest' || 'ubuntu-latest' }}
21 | steps:
22 | - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
23 | with:
24 | repo-token: ${{ secrets.GITHUB_TOKEN }}
25 | stale-pr-message: 'This pull request is stale because it has been open 30 days with no activity. Make a comment or update the PR to avoid closing PR after 15 days.'
26 | days-before-pr-stale: 30
27 | days-before-pr-close: 15
28 | remove-pr-stale-when-updated: 'true'
29 | close-pr-message: 'This pull request was automatically closed due to inactivity'
--------------------------------------------------------------------------------
/.github/workflows/auto-update.yml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | ---
5 |
6 | name: Auto Update PR
7 |
8 | # On push to the main branch and support branches, update any branches that are out of date
9 | # and have auto-merge enabled. If the branch is currently out of date with the base branch,
10 | # it must be first manually updated and then will be kept up to date on future runs.
11 | on:
12 | push:
13 | branches:
14 | - main
15 | - release-*
16 |
17 | permissions: {}
18 |
19 | concurrency:
20 | group: ${{ github.workflow }}-${{ github.ref }}
21 | cancel-in-progress: true
22 |
23 | jobs:
24 | update-pull-requests:
25 | permissions:
26 | contents: read
27 | pull-requests: write
28 | runs-on: ubuntu-latest
29 |
30 | steps:
31 | - name: Checkout repository
32 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
33 | with:
34 | persist-credentials: false
35 |
36 | - name: Update pull requests
37 | uses: open-edge-platform/orch-ci/.github/actions/pr_updater@37eef2d2a0909dfe8ff26bb0730ab2f13dfbcaf6 # 0.1.25
38 | with:
39 | github_token: ${{ secrets.SYS_ORCH_GITHUB }}
--------------------------------------------------------------------------------
/.github/workflows/post-merge-asp.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | name: Post-Merge App Service Proxy
6 |
7 | on:
8 | push:
9 | branches:
10 | - main
11 | - release-*
12 | paths:
13 | - 'app-service-proxy/**'
14 | workflow_dispatch:
15 |
16 | permissions: {}
17 |
18 | jobs:
19 | post-merge-pipeline:
20 | permissions:
21 | contents: read
22 | security-events: write
23 | id-token: write
24 | uses: open-edge-platform/orch-ci/.github/workflows/post-merge.yml@37eef2d2a0909dfe8ff26bb0730ab2f13dfbcaf6 # 0.1.25
25 | with:
26 | run_version_check: true
27 | run_dep_version_check: false
28 | run_build: true
29 | run_docker_build: true
30 | run_docker_push: true
31 | run_version_tag: true
32 | run_helm_build: true
33 | run_helm_push: true
34 | prefix_tag_separator: "/"
35 | project_folder: "app-service-proxy"
36 | secrets:
37 | SYS_ORCH_GITHUB: ${{ secrets.SYS_ORCH_GITHUB }}
38 | COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
39 | COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
40 | NO_AUTH_ECR_PUSH_USERNAME: ${{ secrets.NO_AUTH_ECR_PUSH_USERNAME }}
41 | NO_AUTH_ECR_PUSH_PASSWD: ${{ secrets.NO_AUTH_ECR_PUSH_PASSWD }}
42 | MSTEAMS_WEBHOOK: ${{ secrets.TEAMS_WEBHOOK }}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # jetbrains
6 | .idea
7 | .vscode
8 | .DS_Store
9 | vendor
10 | venv*
11 | *.log
12 | workspace
13 |
14 | *.lock
15 | *.tgz
16 |
17 | */out/**
18 | */bin/**
19 | */build/_output/**
20 |
21 | app-deployment-manager/config/
22 | */test-report.json
23 | # output from make test
24 | */cover.out
25 | */coverage.html
26 | */coverage.xml
27 | app-deployment-manager/pkg/utils/tmpdir/
28 |
29 | # output from Go fuzz tests
30 | app-deployment-manager/internal/northbound/fuzztests/testdata/
31 | app-resource-manager/internal/northbound/services/v2/resource/testdata/
32 | app-service-proxy/internal/server/fuzztests/testdata/
33 |
--------------------------------------------------------------------------------
/.markdownlint.yml:
--------------------------------------------------------------------------------
1 | ---
2 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
3 | # SPDX-License-Identifier: Apache-2.0
4 | default: true
5 | MD004:
6 | style: dash
7 | MD010:
8 | # Code blocks may have hard tabs.
9 | code_blocks: false
10 | MD013:
11 | line_length: 120 # Max line length checking.
12 | code_blocks: false
13 | MD025:
14 | # Ignore the front matter title. Pages still need a top level header (#).
15 | front_matter_title: ""
16 | MD029:
17 | style: ordered
18 | MD033:
19 | allowed_elements:
20 | - ref # allow hugo relative reference links
21 | - br # allow mermaid
to create new line
22 | - a # allow anchors created by protoc-gen-doc and similar tools
23 | - span
24 |
--------------------------------------------------------------------------------
/.markdownlintignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | SECURITY.md
5 | CODE_OF_CONDUCT.md
6 | CONTRIBUTING.md
7 | PULL_REQUEST_TEMPLATE.md
8 | ci/*
9 |
--------------------------------------------------------------------------------
/REUSE.toml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | version = 1
5 |
6 | [[annotations]]
7 | path = ["VERSION", ".github/PULL_REQUEST_TEMPLATE.md"]
8 | precedence = "aggregate"
9 | SPDX-FileCopyrightText = "2025 Intel Corporation"
10 | SPDX-License-Identifier = "Apache-2.0"
11 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 |
5 |
6 | # Security Policy
7 | Intel is committed to rapidly addressing security vulnerabilities affecting our customers and providing clear guidance on the solution, impact, severity and mitigation.
8 |
9 | ## Reporting a Vulnerability
10 | Please report any security vulnerabilities in this project utilizing the guidelines [here](https://www.intel.com/content/www/us/en/security-center/vulnerability-handling-guidelines.html).
--------------------------------------------------------------------------------
/VERSION:
--------------------------------------------------------------------------------
1 | 0.0.0-dev
2 |
--------------------------------------------------------------------------------
/app-deployment-manager/.golangci.yml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | run:
6 | # Autogenerated files take too much time and memory to load,
7 | # even if we skip them with -skip-dirs or -skip-dirs;
8 | # or mark them as generated; or use nolint annotations.
9 | # So we define this tag and use it in the autogenerated files.
10 | build-tags:
11 | - codeanalysis
12 | # Do not run linters on unit-test files
13 | tests: false
14 |
15 | linters:
16 | enable:
17 | - gofmt
18 | - revive
19 | - misspell
20 | - typecheck
21 | - errcheck
22 | - dogsled
23 | - unconvert
24 | - nakedret
25 | - copyloopvar
26 | - gosec
27 |
28 | issues:
29 | exclude:
30 | - Error return value of `.*Close` is not checked
31 | - Error return value of `.*Flush` is not checked
32 | exclude-dirs:
33 | - api/
34 |
35 |
--------------------------------------------------------------------------------
/app-deployment-manager/REUSE.toml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | version = 1
5 |
6 | [[annotations]]
7 | path = ["VERSION", "**.json",
8 | "**go.sum", "artifacts/**", "PROJECT", "**VERSION", "deployment/charts/app-deployment-crd/templates/*",
9 | "api/spec/*", "api/nbi/v2/spec/**", "api/nbi/v2/go.mod", "api/nbi/v2/deployment/v1/**",
10 | "api/nbi/v2/pkg/restClient/**",
11 | "internal/catalogclient/mockery/**", "internal/grafana/mockery/**",
12 | "internal/catalogclient/mocks/m*.go",
13 | "config/certmanager/kustom*.yaml",
14 | "config/**",
15 | ]
16 | precedence = "aggregate"
17 | SPDX-FileCopyrightText = "2025 Intel Corporation"
18 | SPDX-License-Identifier = "Apache-2.0"
19 |
--------------------------------------------------------------------------------
/app-deployment-manager/VERSION:
--------------------------------------------------------------------------------
1 | 2.4.15
2 |
--------------------------------------------------------------------------------
/app-deployment-manager/api/nbi/VERSION:
--------------------------------------------------------------------------------
1 | 2.4.3
2 |
--------------------------------------------------------------------------------
/app-deployment-manager/api/nbi/v2/go.mod:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | module github.com/open-edge-platform/app-orch-deployment/app-deployment-manager/api/nbi/v2
6 |
7 | go 1.23.0
8 |
9 | toolchain go1.23.1
10 |
11 | require (
12 | buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.2-20240717164558-a6c49f84cc0f.2
13 | github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0
14 | github.com/oapi-codegen/runtime v1.1.1
15 | google.golang.org/genproto/googleapis/api v0.0.0-20240610135401-a8a62080eff3
16 | google.golang.org/grpc v1.64.1
17 | google.golang.org/protobuf v1.34.2
18 | )
19 |
20 | require (
21 | github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
22 | github.com/google/uuid v1.6.0 // indirect
23 | golang.org/x/net v0.38.0 // indirect
24 | golang.org/x/sys v0.31.0 // indirect
25 | golang.org/x/text v0.23.0 // indirect
26 | google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
27 | )
28 |
--------------------------------------------------------------------------------
/app-deployment-manager/api/v1beta1/groupversion_info.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | // Package v1beta1 contains API Schema definitions for the app v1beta1 API group
6 | // +kubebuilder:object:generate=true
7 | // +groupName=app.edge-orchestrator.intel.com
8 | package v1beta1
9 |
10 | import (
11 | "k8s.io/apimachinery/pkg/runtime/schema"
12 | "sigs.k8s.io/controller-runtime/pkg/scheme"
13 | )
14 |
15 | var (
16 | // GroupVersion is group version used to register these objects
17 | GroupVersion = schema.GroupVersion{Group: "app.edge-orchestrator.intel.com", Version: "v1beta1"}
18 |
19 | // SchemeBuilder is used to add go types to the GroupVersionKind scheme
20 | SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
21 |
22 | // AddToScheme adds the types in this group-version to the given scheme.
23 | AddToScheme = SchemeBuilder.AddToScheme
24 |
25 | DeploymentsResource = "deployments"
26 | DeploymentClustersResource = "deploymentclusters"
27 | ClustersResource = "clusters"
28 | )
29 |
--------------------------------------------------------------------------------
/app-deployment-manager/buf.gen.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | version: v2
6 | managed:
7 | enabled: true
8 | disable:
9 | - file_option: go_package
10 | module: buf.build/googleapis/googleapis
11 | - file_option: go_package
12 | module: buf.build/grpc-ecosystem/grpc-gateway
13 | - file_option: go_package
14 | module: buf.build/bufbuild/protovalidate
15 | override:
16 | - file_option: go_package_prefix
17 | value: github.com/open-edge-platform/app-orch-deployment/app-deployment-manager/api/nbi/v2
18 | plugins:
19 | - remote: buf.build/protocolbuffers/go:v1.28.1
20 | out: api/nbi/v2
21 | opt: paths=source_relative
22 | - remote: buf.build/grpc/go:v1.2.0
23 | out: api/nbi/v2
24 | opt:
25 | - paths=source_relative
26 | - require_unimplemented_servers=false
27 | - local: protoc-gen-openapi
28 | out: api/nbi/v2/spec
29 | opt:
30 | - title=Application Deployment Manager API
31 | - version=2.0.0
32 | - default_response=false
33 | - enum_type=string
34 | - description=Application Deployment Manager service providing operations for deploying and managing applications.
35 | strategy: all
36 | - remote: buf.build/grpc-ecosystem/gateway:v2.15.2
37 | out: api/nbi/v2
38 | opt: paths=source_relative
39 |
--------------------------------------------------------------------------------
/app-deployment-manager/buf.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | version: v2
6 | modules:
7 | - path: api/nbi/v2
8 | deps:
9 | - buf.build/bufbuild/protovalidate
10 | - buf.build/googleapis/googleapis
11 | lint:
12 | use:
13 | - STANDARD
14 | - ENUM_FIRST_VALUE_ZERO
15 | except:
16 | - FIELD_NOT_REQUIRED
17 | - PACKAGE_NO_IMPORT_CYCLE
18 | - ENUM_VALUE_PREFIX
19 | - ENUM_ZERO_VALUE_SUFFIX
20 | rpc_allow_google_protobuf_empty_responses: true
21 | disallow_comment_ignores: true
22 | breaking:
23 | use:
24 | - FILE
25 | except:
26 | - EXTENSION_NO_DELETE
27 | - FIELD_SAME_DEFAULT
28 |
--------------------------------------------------------------------------------
/app-deployment-manager/cmd/app-deployment-manager/main.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package main
5 |
6 | import (
7 | "flag"
8 |
9 | "github.com/open-edge-platform/app-orch-deployment/app-deployment-manager/internal/manager"
10 | _ "github.com/open-edge-platform/orch-library/go/dazl/zap"
11 | )
12 |
13 | func main() {
14 | caPath := flag.String("caPath", "", "path to CA certificate")
15 | keyPath := flag.String("keyPath", "", "path to client private key")
16 | certPath := flag.String("certPath", "", "path to client certificate")
17 | kubeconfig := flag.String("kubeconfig", "", "path to kubeconfig")
18 | flag.Parse()
19 |
20 | ready := make(chan bool)
21 | cfg := manager.Config{
22 | CAPath: *caPath,
23 | KeyPath: *keyPath,
24 | CertPath: *certPath,
25 | GRPCPort: 8080,
26 | Kubeconfig: *kubeconfig,
27 | }
28 |
29 | mgr := manager.NewManager(cfg)
30 | mgr.Run()
31 | <-ready
32 | }
33 |
--------------------------------------------------------------------------------
/app-deployment-manager/controllers/controller.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package controllers
6 |
7 | import (
8 | "k8s.io/apimachinery/pkg/runtime"
9 | "k8s.io/client-go/rest"
10 | "k8s.io/client-go/tools/record"
11 | "sigs.k8s.io/controller-runtime/pkg/cache"
12 | "sigs.k8s.io/controller-runtime/pkg/client"
13 | "sigs.k8s.io/controller-runtime/pkg/manager"
14 | )
15 |
16 | func New(name string, mgr manager.Manager) *Controller {
17 | return &Controller{
18 | Client: mgr.GetClient(),
19 | Cache: mgr.GetCache(),
20 | Scheme: mgr.GetScheme(),
21 | Config: mgr.GetConfig(),
22 | Events: mgr.GetEventRecorderFor(name),
23 | }
24 | }
25 |
26 | type ManagedController interface {
27 | SetupWithManager(mgr manager.Manager) error
28 | }
29 |
30 | type Controller struct {
31 | client.Client
32 | Cache cache.Cache
33 | Scheme *runtime.Scheme
34 | Config *rest.Config
35 | Events record.EventRecorder
36 | }
37 |
--------------------------------------------------------------------------------
/app-deployment-manager/controllers/license.go.txt:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-crd/.helmignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # Patterns to ignore when building packages.
6 | # This supports shell glob matching, relative path matching, and
7 | # negation (prefixed with !). Only one pattern per line.
8 | .DS_Store
9 |
10 | # Common VCS dirs
11 | .git/
12 | .gitignore
13 | .bzr/
14 | .bzrignore
15 | .hg/
16 | .hgignore
17 | .svn/
18 |
19 | # Common backup files
20 | *.swp
21 | *.bak
22 | *.tmp
23 | *~
24 |
25 | # Various IDEs
26 | .project
27 | .idea/
28 | *.tmproj
29 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-crd/Chart.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 - 2025 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | ---
5 | apiVersion: v2
6 | description: App Deployment CustomResourceDefinitions
7 | name: app-deployment-crd
8 | # Correct version will be added by "make helm-package" from VERSION
9 | version: 2.4.15
10 | annotations:
11 | revision: "eb9c779"
12 | created: "2025-06-04T15:48:28Z"
13 | appVersion: 2.4.15
14 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-crd/values.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # This file is intentionally empty
6 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/.helmignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # Patterns to ignore when building packages.
6 | # This supports shell glob matching, relative path matching, and
7 | # negation (prefixed with !). Only one pattern per line.
8 | .DS_Store
9 |
10 | # Common VCS dirs
11 | .git/
12 | .gitignore
13 | .bzr/
14 | .bzrignore
15 | .hg/
16 | .hgignore
17 | .svn/
18 |
19 | # Common backup files
20 | *.swp
21 | *.bak
22 | *.tmp
23 | *~
24 |
25 | # Various IDEs
26 | .project
27 | .idea/
28 | *.tmproj
29 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/Chart.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 - 2025 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | ---
5 | apiVersion: v2
6 | description: App Deployment Manager
7 | name: app-deployment-manager
8 | # Correct version will be added by "make helm-package" from VERSION
9 | version: 2.4.15
10 | annotations:
11 | revision: "eb9c779"
12 | created: "2025-06-04T15:48:28Z"
13 | appVersion: 2.4.15
14 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/common.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | hasWriteAccess if {
9 | projectRole := sprintf("%s_ao-rw", [input.metadata.activeprojectid[0]])
10 | some role in input.metadata["realm_access/roles"] # iteration
11 | [projectRole][_] == role
12 | }
13 |
14 | hasReadAccess if {
15 | projectRole := sprintf("%s_ao-rw", [input.metadata.activeprojectid[0]])
16 | some role in input.metadata["realm_access/roles"] # iteration
17 | [projectRole][_] == role
18 | }
19 |
20 | hasWriteAccess if {
21 | projectRole := "ao-m2m-rw"
22 | some role in input.metadata["realm_access/roles"] # iteration
23 | [projectRole][_] == role
24 | }
25 |
26 | hasReadAccess if {
27 | projectRole := "ao-m2m-rw"
28 | some role in input.metadata["realm_access/roles"] # iteration
29 | [projectRole][_] == role
30 | }
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/common_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | test_has_write_access if {
7 | hasWriteAccess with input as {
8 | "request": {
9 | "displayName": "test display name",
10 | "publisherName": "intel",
11 | "profileName": "testing",
12 | "appVersion": "0.1.1",
13 | "appName": "test-name",
14 | "overrideValues": [{
15 | "appName": "test-wordpress",
16 | "targetNamespace": "test-targetnamespace",
17 | "values": {"service": {"type": "test-type"}},
18 | }],
19 | "targetClusters": [{
20 | "appName": "wordpress",
21 | "labels": {"color": "red"},
22 | }],
23 | },
24 | "metadata": {"realm_access/roles": [
25 | "default-roles-master",
26 | "offline_access",
27 | "ao-m2m-rw",
28 | "uma_authorization",
29 | ]},
30 | }
31 | }
32 |
33 | test_has_read_access if {
34 | hasReadAccess with input as {
35 | "request": {"depl_id": "5d0cef5c-9981-4987-a67e-3e207783218b"},
36 | "metadata": {"realm_access/roles": [
37 | "default-roles-master",
38 | "offline_access",
39 | "ao-m2m-rw",
40 | "uma_authorization",
41 | ]},
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/create.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | CreateDeploymentRequest if {
9 | hasWriteAccess
10 | }
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/delete.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | DeleteDeploymentRequest if {
9 | hasWriteAccess
10 | }
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/delete_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | # delete deployment with app-deployment-manager-write role
7 | test_delete_deployment_write_role if {
8 | DeleteDeploymentRequest with input as {
9 | "request": {"depl_id": "5d0cef5c-9981-4987-a67e-3e207783218b"},
10 | "metadata": {"realm_access/roles": [
11 | "default-roles-master",
12 | "offline_access",
13 | "ao-m2m-rw",
14 | "uma_authorization",
15 | ]},
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/get.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | GetDeploymentRequest if {
9 | hasReadAccess
10 | }
11 |
12 | GetDeploymentsStatusRequest if {
13 | hasReadAccess
14 | }
15 |
16 | GetClusterRequest if {
17 | hasReadAccess
18 | }
19 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/get_app_namespace.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | GetAppNamespaceRequest if {
9 | hasReadAccess
10 | }
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/get_app_namespace_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | # get app namespace with ao-m2m-rw
7 | #
8 | # ao-m2m-rw
9 | #
10 | test_get_app_namespace_read_role if {
11 | GetAppNamespaceRequest with input as {
12 | "request": {"app_id": "b-bf3059c9-a156-5a24-841c-37957ec6d185"},
13 | "metadata": {"realm_access/roles": [
14 | "default-roles-master",
15 | "offline_access",
16 | "ao-m2m-rw",
17 | "uma_authorization",
18 | ]},
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/get_kubeconfig.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | GetKubeConfigRequest if {
9 | hasReadAccess
10 | }
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/get_kubeconfig_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | # get kubeConfig with ao-m2m-rw
7 | #
8 | # ao-m2m-rw
9 | test_get_kube_config_read_role if {
10 | GetKubeConfigRequest with input as {
11 | "request": {"cluster_id": "cluster-46f4a3485e28"},
12 | "metadata": {"realm_access/roles": [
13 | "default-roles-master",
14 | "offline_access",
15 | "ao-m2m-rw",
16 | "uma_authorization",
17 | ]},
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/list.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | ListDeploymentsRequest if {
9 | hasReadAccess
10 | }
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/list_cluster.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | ListClustersRequest if {
9 | hasReadAccess
10 | }
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/list_cluster_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | # list clusters with ao-m2m-rw
7 | test_list_clusters_write_role if {
8 | not ListClustersRequest with input as {
9 | "request": {"labels": "customer=test"},
10 | "metadata": {"realm_access/roles": [
11 | "default-roles-master",
12 | "offline_access",
13 | "uma_authorization",
14 | ]},
15 | }
16 | }
17 |
18 | # list clusters with ao-m2m-rw
19 | test_list_clusters_read_role if {
20 | ListClustersRequest with input as {
21 | "request": {"labels": "customer=test"},
22 | "metadata": {"realm_access/roles": [
23 | "default-roles-master",
24 | "offline_access",
25 | "ao-m2m-rw",
26 | "uma_authorization",
27 | ]},
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/list_deployment_clusters.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | ListDeploymentClustersRequest if {
9 | hasReadAccess
10 | }
11 |
12 | ListDeploymentsPerClusterRequest if {
13 | hasReadAccess
14 | }
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/list_deployment_clusters_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | # ao-m2m-rw
9 | test_list_deployment_clusters_read_write_role if {
10 | not ListDeploymentClustersRequest with input as {
11 | "request": {"deplId": "deployment-1"},
12 | "metadata": {"realm_access/roles": [
13 | "default-roles-master",
14 | "offline_access",
15 | "uma_authorization",
16 | ]},
17 | }
18 | }
19 |
20 | # ao-m2m-rw
21 | test_list_deployment_clusters_read_role if {
22 | ListDeploymentClustersRequest with input as {
23 | "request": {"deplId": "deployment-2"},
24 | "metadata": {"realm_access/roles": [
25 | "default-roles-master",
26 | "offline_access",
27 | "ao-m2m-rw",
28 | "uma_authorization",
29 | ]},
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/list_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | # list deployments with ao-m2m-rw
7 | test_list_deployments_read_role if {
8 | ListDeploymentsRequest with input as {
9 | "request": {"labels": "customer=test"},
10 | "metadata": {"realm_access/roles": [
11 | "default-roles-master",
12 | "offline_access",
13 | "ao-m2m-rw",
14 | "uma_authorization",
15 | ]},
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/files/openpolicyagent/update.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package deploymentv1
5 |
6 | import future.keywords.in
7 |
8 | UpdateDeploymentRequest if {
9 | hasWriteAccess
10 | }
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/templates/NOTES.txt:
--------------------------------------------------------------------------------
1 | App Deployment Manager
2 | ---
3 |
4 | The App Deployment Manager service provides a friendly,
5 | high-level interface to the Rancher Fleet GitOps-based deployment tool.
6 |
7 | See https://fleet.rancher.io/ for details on Rancher Fleet.
8 |
9 | ---
10 | revision: {{ .Chart.Annotations.revision }}
11 | created: {{ .Chart.Annotations.created }}
12 | SPDX-License-Identifier: Apache-2.0
13 |
14 | Copyright (C) 2023 Intel Corporation
15 |
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/templates/cert-webhook.yaml:
--------------------------------------------------------------------------------
1 | # yamllint disable-file
2 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
3 | #
4 | # SPDX-License-Identifier: Apache-2.0
5 | ---
6 | apiVersion: cert-manager.io/v1
7 | kind: Issuer
8 | metadata:
9 | name: selfsigned-issuer
10 | namespace: {{ .Release.Namespace }}
11 | spec:
12 | selfSigned: {}
13 | ---
14 | apiVersion: cert-manager.io/v1
15 | kind: Certificate
16 | metadata:
17 | name: webhook-server-cert
18 | namespace: {{ .Release.Namespace }}
19 | spec:
20 | dnsNames:
21 | - "webhook-service.{{ .Release.Namespace }}.svc"
22 | - "webhook-service.{{ .Release.Namespace }}.svc.cluster.local"
23 | issuerRef:
24 | kind: Issuer
25 | name: selfsigned-issuer
26 | secretName: webhook-server-cert
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/templates/service-webhook.yaml:
--------------------------------------------------------------------------------
1 | # yamllint disable-file
2 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
3 | #
4 | # SPDX-License-Identifier: Apache-2.0
5 | ---
6 | apiVersion: v1
7 | kind: Service
8 | metadata:
9 | labels:
10 | app.kubernetes.io/component: webhook
11 | app.kubernetes.io/instance: webhook-service
12 | name: webhook-service
13 | spec:
14 | ports:
15 | - name: tcp-webhook
16 | port: 443
17 | protocol: TCP
18 | targetPort: 9443
19 | selector:
20 | app: {{ template "app-deployment-manager.name" . }}
--------------------------------------------------------------------------------
/app-deployment-manager/deployment/charts/app-deployment-manager/templates/serviceaccount.yaml:
--------------------------------------------------------------------------------
1 | # yamllint disable-file
2 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
3 | #
4 | # SPDX-License-Identifier: Apache-2.0
5 | ---
6 | {{- if .Values.adm.serviceAccount.create }}
7 | apiVersion: v1
8 | kind: ServiceAccount
9 | metadata:
10 | name: {{ template "app-deployment-manager.serviceAccountName" . }}
11 | labels:
12 | {{- include "app-deployment-manager.labels" . | nindent 4 }}
13 | {{- end }}
14 |
--------------------------------------------------------------------------------
/app-deployment-manager/grafana/custom-metrics/config.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | ---
5 | customMetrics:
6 | # - metric: # Raw custom metric (required)
7 | # type: # Metric type: counter/gauge/histogram (required)
8 | # expr: # Prom_ql for the metric (optional)
9 | # unit: # Unit of measurement, examples: s,none,bytes,percent,etc. (optional)
10 | #
11 | #
12 | # Example:
13 | # ---
14 | # customMetrics:
15 | # - metric: foo_bar
16 | # unit: none
17 | # type: histogram
18 | # expr: histogram_quantile(0.90, sum by(instance, le) (rate(foo_bar{job=\"$job\", namespace=\"$namespace\"}[5m])))
19 |
--------------------------------------------------------------------------------
/app-deployment-manager/hadolint.yml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | ---
6 | --ignore SC2086
7 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/catalogclient/catalogclient_suite_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 | package catalogclient_test
4 |
5 | import (
6 | "testing"
7 |
8 | . "github.com/onsi/ginkgo/v2"
9 | . "github.com/onsi/gomega"
10 | gomock "go.uber.org/mock/gomock"
11 | )
12 |
13 | var mockCtrl *gomock.Controller
14 |
15 | func TestCatalogclient(t *testing.T) {
16 | RegisterFailHandler(Fail)
17 |
18 | mockCtrl = gomock.NewController(t)
19 | defer mockCtrl.Finish()
20 |
21 | RunSpecs(t, "Catalogclient Suite")
22 | }
23 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/catalogclient/export_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package catalogclient
6 |
7 | var GetProfileMap = getProfileMap
8 | var GetAppValues = getAppValues
9 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/istio/config.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package istio
6 |
7 | const (
8 | IstioInjectionLabelKey = "istio-injection"
9 | IstioInjectionLabelValueEnabled = "enabled"
10 | )
11 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/manager/manager_suite_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package manager
6 |
7 | import (
8 | "testing"
9 |
10 | . "github.com/onsi/ginkgo/v2"
11 | . "github.com/onsi/gomega"
12 | )
13 |
14 | func TestManager(t *testing.T) {
15 | RegisterFailHandler(Fail)
16 |
17 | RunSpecs(t, "Manager Suite")
18 | }
19 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/metrics/metrics.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package metrics
6 |
7 | import (
8 | "github.com/prometheus/client_golang/prometheus"
9 | )
10 |
11 | var (
12 | // Custom collector
13 | Reg = prometheus.NewRegistry()
14 |
15 | // DeploymentStatus is a prometheus metric which holds the deployment id,
16 | // deployment name and deployment status of a ADM per-deployment.
17 | DeploymentStatus = prometheus.NewGaugeVec(prometheus.GaugeOpts{
18 | Name: "adm_deployment_status",
19 | Help: "Per-deployment status",
20 | }, []string{"projectId", "deployment_id", "deployment_name", "status"})
21 |
22 | // DeploymentClusterStatus is a prometheus metric which holds the deployment id,
23 | // deployment name, cluster id and cluster status of a ADM per-deployment per-cluster.
24 | DeploymentClusterStatus = prometheus.NewGaugeVec(prometheus.GaugeOpts{
25 | Name: "adm_deployment_cluster_status",
26 | Help: "Per-deployment per-cluster status",
27 | }, []string{"projectId", "deployment_id", "deployment_name", "cluster_id", "cluster_name", "status"})
28 | )
29 |
30 | func init() {
31 | // Register custom metrics with prometheus registry
32 | Reg.MustRegister(DeploymentStatus, DeploymentClusterStatus)
33 | }
34 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/patch/options.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package patch
6 |
7 | // Option is some configuration that modifies options for a patch request.
8 | type Option interface {
9 | ApplyToHelper(*HelperOptions)
10 | }
11 |
12 | type HelperOptions struct {
13 | // IncludeStatusObservedGeneration sets the status.observedGeneration field
14 | // on the incoming object to match metadata.generation, only if there is a change.
15 | IncludeStatusObservedGeneration bool
16 | }
17 |
18 | type WithStatusObservedGeneration struct{}
19 |
20 | // ApplyToHelper applies this configuration to the given HelperOptions.
21 | func (w WithStatusObservedGeneration) ApplyToHelper(in *HelperOptions) {
22 | in.IncludeStatusObservedGeneration = true
23 | }
24 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/randomtoken/token.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package randomtoken
6 |
7 | import (
8 | "crypto/rand"
9 | "math/big"
10 | )
11 |
12 | const (
13 | characters = "bcdfghjklmnpqrstvwxz2456789"
14 | tokenLength = 54
15 | )
16 |
17 | var charsLength = big.NewInt(int64(len(characters)))
18 |
19 | func Generate() (string, error) {
20 | token := make([]byte, tokenLength)
21 | for i := range token {
22 | r, err := rand.Int(rand.Reader, charsLength)
23 | if err != nil {
24 | return "", err
25 | }
26 | token[i] = characters[r.Int64()]
27 | }
28 | return string(token), nil
29 | }
30 |
--------------------------------------------------------------------------------
/app-deployment-manager/internal/randomtoken/token_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package randomtoken
6 |
7 | import (
8 | "crypto/rand"
9 | "errors"
10 | "github.com/golang/mock/gomock"
11 | "github.com/stretchr/testify/assert"
12 | "github.com/undefinedlabs/go-mpatch"
13 | "io"
14 | "math/big"
15 | "testing"
16 | )
17 |
18 | func unpatchAll(list []*mpatch.Patch) error {
19 | for _, p := range list {
20 | err := p.Unpatch()
21 | if err != nil {
22 | return err
23 | }
24 | }
25 | return nil
26 | }
27 |
28 | func TestGenerate(t *testing.T) {
29 | tk, err := Generate()
30 | assert.NoError(t, err)
31 | assert.NotEqual(t, "", tk)
32 | }
33 |
34 | func TestGenerate_ErrorRand(t *testing.T) {
35 | ctrl := gomock.NewController(t)
36 | defer ctrl.Finish()
37 |
38 | patch := func(ctrl *gomock.Controller) []*mpatch.Patch {
39 | f1, err := mpatch.PatchMethod(rand.Int, func(rand io.Reader, max *big.Int) (n *big.Int, err error) {
40 | return nil, errors.New("tmp")
41 | })
42 | if err != nil {
43 | t.Errorf("patch error: %v", err)
44 | }
45 |
46 | return []*mpatch.Patch{f1}
47 | }
48 | pList := patch(ctrl)
49 | tk, err := Generate()
50 | assert.Error(t, err)
51 | assert.Equal(t, "", tk)
52 | err = unpatchAll(pList)
53 | if err != nil {
54 | t.Error(err)
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/app-deployment-manager/pkg/appdeploymentclient/v1beta1/v1alpha3_suite_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package v1beta1
6 |
7 | import (
8 | "testing"
9 |
10 | . "github.com/onsi/ginkgo/v2"
11 | . "github.com/onsi/gomega"
12 | )
13 |
14 | func TestAppDeploymentClient(t *testing.T) {
15 | RegisterFailHandler(Fail)
16 | RunSpecs(t, "v1beta1 Suite")
17 | }
18 |
--------------------------------------------------------------------------------
/app-deployment-manager/pkg/fleet/mocks/mocks.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package fleetclient
6 |
7 | import (
8 | "bytes"
9 | "encoding/json"
10 | "fmt"
11 | "io"
12 | "net/http"
13 |
14 | runtime "k8s.io/apimachinery/pkg/runtime"
15 | )
16 |
17 | func NewRequestHandler(retObj runtime.Object, statusCode int) func(req *http.Request) (*http.Response, error) {
18 | return func(_ *http.Request) (*http.Response, error) {
19 | retData, err := json.Marshal(retObj)
20 | if err != nil {
21 | return nil, fmt.Errorf("failed to marshall desired return Object: %w", err)
22 | }
23 |
24 | return &http.Response{
25 | StatusCode: statusCode,
26 | Body: io.NopCloser(bytes.NewReader(retData)),
27 | }, nil
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app-deployment-manager/pkg/gitclient/gitclient_suite_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | package gitclient
5 |
6 | import (
7 | "testing"
8 |
9 | . "github.com/onsi/ginkgo/v2"
10 | . "github.com/onsi/gomega"
11 | )
12 |
13 | func TestGitclient(t *testing.T) {
14 | RegisterFailHandler(Fail)
15 | RunSpecs(t, "Gitclient Suite")
16 | }
17 |
--------------------------------------------------------------------------------
/app-deployment-manager/pkg/k8sclient/client.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package k8sclient
6 |
7 | import (
8 | "github.com/open-edge-platform/app-orch-deployment/app-deployment-manager/pkg/utils"
9 | "github.com/open-edge-platform/app-orch-deployment/app-deployment-manager/pkg/utils/ratelimiter"
10 |
11 | "github.com/open-edge-platform/orch-library/go/dazl"
12 | "k8s.io/client-go/kubernetes"
13 | )
14 |
15 | var log = dazl.GetPackageLogger()
16 |
17 | // NewClient returns an instance of k8s client based on a given kubeConfig
18 | func NewClient(kubeConfig string) (*kubernetes.Clientset, error) {
19 | config, err := utils.CreateRestConfig(kubeConfig)
20 | if err != nil {
21 | log.Warnw("Failed to create REST config from kubeConfig", dazl.Error(err))
22 | return nil, err
23 | }
24 |
25 | qps, burst, err := ratelimiter.GetRateLimiterParams()
26 | if err != nil {
27 | log.Warnw("Failed to get rate limiter parameters", dazl.Error(err))
28 | return nil, err
29 | }
30 |
31 | config.QPS = float32(qps)
32 | config.Burst = int(burst)
33 |
34 | clientSet, err := kubernetes.NewForConfig(config)
35 | if err != nil {
36 | log.Warnw("Failed to create k8s clientset", dazl.Error(err))
37 | return nil, err
38 | }
39 |
40 | return clientSet, nil
41 | }
42 |
--------------------------------------------------------------------------------
/app-deployment-manager/pkg/logchecker/logchecker.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | // Package logchecker is a library for checking and transforming log messages based on user-defined rules.
5 | package logchecker
6 |
7 | import (
8 | "regexp"
9 | "sync"
10 | )
11 |
12 | type LogChecker struct {
13 | patterns map[*regexp.Regexp]string
14 | mu sync.RWMutex // Mutex for thread-safe writes to the map
15 | }
16 |
17 | func New() *LogChecker {
18 | return &LogChecker{
19 | patterns: make(map[*regexp.Regexp]string),
20 | }
21 | }
22 |
23 | func (lc *LogChecker) AddCheck(pattern, response string) {
24 | re := regexp.MustCompile(pattern) // Compile the pattern
25 | lc.mu.Lock() // Ensure thread safety on writes
26 | lc.patterns[re] = response
27 | lc.mu.Unlock()
28 | }
29 |
30 | func (lc *LogChecker) ProcessLog(log string) string {
31 | lc.mu.RLock() // Read lock for thread-safe reading
32 | defer lc.mu.RUnlock()
33 | for re, response := range lc.patterns {
34 | if re.MatchString(log) {
35 | return response
36 | }
37 | }
38 | return log // Return the original log if no patterns match
39 | }
40 |
--------------------------------------------------------------------------------
/app-deployment-manager/pkg/utils/ratelimiter/utils.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package ratelimiter
5 |
6 | import (
7 | "github.com/open-edge-platform/orch-library/go/dazl"
8 | "os"
9 | "strconv"
10 | )
11 |
12 | const (
13 | rateLimiterQPS = "RATE_LIMITER_QPS"
14 | rateLimiterBurst = "RATE_LIMITER_BURST"
15 | )
16 |
17 | var log = dazl.GetPackageLogger()
18 |
19 | func GetRateLimiterParams() (float64, int64, error) {
20 | qps := os.Getenv(rateLimiterQPS)
21 | qpsValue, err := strconv.ParseFloat(qps, 32)
22 | if err != nil {
23 | log.Warn(err)
24 | return 0, 0, err
25 |
26 | }
27 | burst := os.Getenv(rateLimiterBurst)
28 | burstValue, err := strconv.ParseInt(burst, 10, 32)
29 | if err != nil {
30 | log.Warn(err)
31 | return 0, 0, err
32 |
33 | }
34 | return qpsValue, burstValue, nil
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/app-deployment-manager/requirements.txt:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # license checking
6 | python-debian==0.1.44
7 | reuse~=5.0.0
8 |
9 | # lint yaml
10 | yamllint~=1.35.1
11 |
--------------------------------------------------------------------------------
/app-interconnect/.golangci.yml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | run:
6 | # Autogenerated files take too much time and memory to load,
7 | # even if we skip them with -skip-dirs or -skip-dirs;
8 | # or mark them as generated; or use nolint annotations.
9 | # So we define this tag and use it in the autogenerated files.
10 | build-tags:
11 | - codeanalysis
12 | # Do not run linters on unit-test files
13 | tests: false
14 |
15 | linters:
16 | enable:
17 | - gofmt
18 | - revive
19 | - misspell
20 | - typecheck
21 | - errcheck
22 | - dogsled
23 | - unconvert
24 | - nakedret
25 | - copyloopvar
26 | - gosec
27 |
28 | issues:
29 | exclude:
30 | - Error return value of `.*Close` is not checked
31 | - Error return value of `.*Flush` is not checked
32 | exclude-dirs:
33 | - internal/skupper
34 |
--------------------------------------------------------------------------------
/app-interconnect/REUSE.toml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | version = 1
4 |
5 | [[annotations]]
6 | path = [
7 | "VERSION", "go.sum", "build/_output/**", "internal/skupper/**", "artifacts/**",
8 | "config/**", "deploy/charts/app-interconnect-manager/crds/**"
9 | ]
10 | precedence = "aggregate"
11 | SPDX-FileCopyrightText = "2025 Intel Corporation"
12 | SPDX-License-Identifier = "Apache-2.0"
13 |
--------------------------------------------------------------------------------
/app-interconnect/VERSION:
--------------------------------------------------------------------------------
1 | 0.2.2-dev
2 |
--------------------------------------------------------------------------------
/app-interconnect/build/Dockerfile:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2024-present Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | FROM golang:1.24.2@sha256:d9db32125db0c3a680cfb7a1afcaefb89c898a075ec148fdc2f0f646cc2ed509 AS build
5 |
6 | RUN mkdir /build
7 | WORKDIR /build
8 |
9 | COPY go.mod go.sum ./
10 | COPY ./cmd ./cmd
11 | COPY ./pkg ./pkg
12 | COPY ./internal ./internal
13 | COPY ./vendor ./vendor
14 |
15 |
16 | ARG org_label_schema_version=unknown
17 | ARG org_label_schema_vcs_ref=unknown
18 | ARG org_opencord_vcs_dirty=unknown
19 | ARG TARGETPLATFORM
20 |
21 | RUN if [ "${TARGETPLATFORM}" = "linux/amd64" ] ; then \
22 | CGO_ENABLED=0 go build -mod=vendor \
23 | -o interconnect-manager \
24 | -gcflags="all=-spectre=all -N -l" -asmflags="all=-spectre=all" --trimpath \
25 | -ldflags "all=-s -w" \
26 | ./cmd/interconnect-manager; \
27 | else \
28 | CGO_ENABLED=0 go build -mod=vendor -trimpath -o interconnect-manager ./cmd/interconnect-manager; \
29 | fi
30 |
31 | FROM gcr.io/distroless/static:nonroot@sha256:c0f429e16b13e583da7e5a6ec20dd656d325d88e6819cafe0adb0828976529dc
32 | USER nonroot
33 |
34 | COPY --from=build --chown=65532:65532 /build/interconnect-manager /usr/local/bin/interconnect-manager
35 |
36 | ENTRYPOINT ["/usr/local/bin/interconnect-manager"]
37 |
--------------------------------------------------------------------------------
/app-interconnect/deploy/charts/app-interconnect-manager/.helmignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | # Patterns to ignore when building packages.
5 | # This supports shell glob matching, relative path matching, and
6 | # negation (prefixed with !). Only one pattern per line.
7 | .DS_Store
8 | # Common VCS dirs
9 | .git/
10 | .gitignore
11 | .bzr/
12 | .bzrignore
13 | .hg/
14 | .hgignore
15 | .svn/
16 | # Common backup files
17 | *.swp
18 | *.bak
19 | *.tmp
20 | *.orig
21 | *~
22 | # Various IDEs
23 | .project
24 | .idea/
25 | *.tmproj
26 | .vscode/
27 |
--------------------------------------------------------------------------------
/app-interconnect/deploy/charts/app-interconnect-manager/Chart.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | ---
5 | apiVersion: v2
6 | name: app-interconnect-manager
7 | description: A Helm chart for Kubernetes
8 | type: application
9 | version: 0.2.2-dev
10 | appVersion: "0.2.2-dev-30701f0"
11 | annotations:
12 | revision: "30701f0"
13 | created: "2025-05-06T21:49:46Z"
14 |
--------------------------------------------------------------------------------
/app-interconnect/deploy/charts/app-interconnect-manager/templates/clusterrolebinding.yaml:
--------------------------------------------------------------------------------
1 | # yamllint disable-file
2 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
3 | #
4 | # SPDX-License-Identifier: Apache-2.0
5 | ---
6 |
7 | apiVersion: rbac.authorization.k8s.io/v1
8 | kind: ClusterRoleBinding
9 | metadata:
10 | name: {{ template "interconnect-manager.fullname" . }}
11 | labels:
12 | {{ include "interconnect-manager.labels" . | nindent 4 }}
13 | roleRef:
14 | apiGroup: rbac.authorization.k8s.io
15 | kind: ClusterRole
16 | name: {{ template "interconnect-manager.fullname" . }}
17 | subjects:
18 | - kind: ServiceAccount
19 | name: {{ template "interconnect-manager.serviceAccountName" . }}
20 | namespace: {{ .Release.Namespace }}
21 |
--------------------------------------------------------------------------------
/app-interconnect/deploy/charts/app-interconnect-manager/templates/configmap.yaml:
--------------------------------------------------------------------------------
1 | # yamllint disable-file
2 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
3 | #
4 | # SPDX-License-Identifier: Apache-2.0
5 | ---
6 | apiVersion: v1
7 | kind: ConfigMap
8 | metadata:
9 | name: {{ include "interconnect-manager.fullname" . }}
10 | labels:
11 | {{- include "interconnect-manager.labels" . | nindent 4 }}
12 | data:
13 | logging.yaml: |-
14 | {{ toYaml .Values.logging | indent 4 }}
15 |
--------------------------------------------------------------------------------
/app-interconnect/deploy/charts/app-interconnect-manager/templates/serviceaccount.yaml:
--------------------------------------------------------------------------------
1 | # yamllint disable-file
2 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
3 | #
4 | # SPDX-License-Identifier: Apache-2.0
5 | ---
6 | {{- if .Values.interconnect_manager.serviceAccount.create }}
7 | apiVersion: v1
8 | kind: ServiceAccount
9 | metadata:
10 | name: {{ template "interconnect-manager.serviceAccountName" . }}
11 | labels:
12 | {{- include "interconnect-manager.labels" . | nindent 4 }}
13 | {{- end }}
--------------------------------------------------------------------------------
/app-interconnect/hack/boilerplate.go.txt:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
--------------------------------------------------------------------------------
/app-interconnect/hack/update-codegen.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
4 | # SPDX-License-Identifier: Apache-2.0
5 |
6 | set -o errexit
7 | set -o nounset
8 | set -o pipefail
9 |
10 | SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")"
11 | SCRIPT_ROOT="${SCRIPT_DIR}/.."
12 | CODEGEN_PKG="${CODEGEN_PKG:-"${SCRIPT_ROOT}/../../code-generator"}"
13 |
14 | source "${CODEGEN_PKG}/kube_codegen.sh"
15 |
16 | THIS_PKG="github.com/open-edge-platform/app-orch-deployment/app-interconnect"
17 |
18 | kube::codegen::gen_helpers \
19 | --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \
20 | "${SCRIPT_ROOT}"
21 |
22 | if [[ -n "${API_KNOWN_VIOLATIONS_DIR:-}" ]]; then
23 | report_filename="${API_KNOWN_VIOLATIONS_DIR}/codegen_violation_exceptions.list"
24 | if [[ "${UPDATE_API_KNOWN_VIOLATIONS:-}" == "true" ]]; then
25 | update_report="--update-report"
26 | fi
27 | fi
28 |
29 | kube::codegen::gen_client \
30 | --with-watch \
31 | --output-dir "${SCRIPT_ROOT}/pkg" \
32 | --output-pkg "${THIS_PKG}/pkg" \
33 | --boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \
34 | "${SCRIPT_ROOT}/pkg/apis"
35 |
--------------------------------------------------------------------------------
/app-interconnect/internal/cluster/interface.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package clusterclient
6 |
7 | import (
8 | "context"
9 | "k8s.io/client-go/rest"
10 | )
11 |
12 | type ProjectID string
13 |
14 | type ClusterID string
15 |
16 | type Client interface {
17 | GetClusterConfig(ctx context.Context, clusterID ClusterID, projectID ProjectID) (*rest.Config, error)
18 | }
19 |
--------------------------------------------------------------------------------
/app-interconnect/internal/cluster/local.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package clusterclient
6 |
7 | import (
8 | "context"
9 | "k8s.io/client-go/rest"
10 | )
11 |
12 | type LocalClientOption func(*LocalClientOptions)
13 |
14 | type LocalClientOptions struct {
15 | }
16 |
17 | func NewLocalClient(opts ...LocalClientOption) (Client, error) {
18 | var options LocalClientOptions
19 | for _, opt := range opts {
20 | opt(&options)
21 | }
22 | return &localClient{}, nil
23 | }
24 |
25 | type localClient struct{}
26 |
27 | func (c *localClient) GetClusterConfig(_ context.Context, _ ClusterID, _ ProjectID) (*rest.Config, error) {
28 | return rest.InClusterConfig()
29 | }
30 |
--------------------------------------------------------------------------------
/app-interconnect/internal/controller/controller.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package controller
6 |
7 | import (
8 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/cluster"
9 | "k8s.io/apimachinery/pkg/runtime"
10 | "k8s.io/client-go/rest"
11 | "k8s.io/client-go/tools/record"
12 | "sigs.k8s.io/controller-runtime/pkg/cache"
13 | "sigs.k8s.io/controller-runtime/pkg/client"
14 | "sigs.k8s.io/controller-runtime/pkg/manager"
15 | )
16 |
17 | func New(mgr manager.Manager, clusters clusterclient.Client) *Controller {
18 | return &Controller{
19 | Client: mgr.GetClient(),
20 | Cache: mgr.GetCache(),
21 | Scheme: mgr.GetScheme(),
22 | Config: mgr.GetConfig(),
23 | Events: mgr.GetEventRecorderFor("interconnect-manager"),
24 | Clusters: clusters,
25 | }
26 | }
27 |
28 | type ManagedController interface {
29 | Setup(mgr manager.Manager) error
30 | }
31 |
32 | type Controller struct {
33 | client.Client
34 | Cache cache.Cache
35 | Scheme *runtime.Scheme
36 | Config *rest.Config
37 | Events record.EventRecorder
38 | Clusters clusterclient.Client
39 | }
40 |
--------------------------------------------------------------------------------
/app-interconnect/internal/controller/interconnect/controllers.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package interconnect
5 |
6 | import (
7 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/cluster"
8 | "github.com/open-edge-platform/orch-library/go/dazl"
9 | "sigs.k8s.io/controller-runtime/pkg/manager"
10 | )
11 |
12 | var log = dazl.GetPackageLogger()
13 |
14 | // AddControllers adds all network controllers to the given manager
15 | func AddControllers(mgr manager.Manager, clusters clusterclient.Client) error {
16 | if err := AddClusterController(mgr, clusters); err != nil {
17 | log.Error(err)
18 | return err
19 | }
20 | if err := AddClusterStatusController(mgr, clusters); err != nil {
21 | log.Error(err)
22 | return err
23 | }
24 | if err := AddLinkController(mgr, clusters); err != nil {
25 | log.Error(err)
26 | return err
27 | }
28 | if err := AddServiceController(mgr, clusters); err != nil {
29 | log.Error(err)
30 | return err
31 | }
32 | return nil
33 | }
34 |
--------------------------------------------------------------------------------
/app-interconnect/internal/controller/utils/project_types.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | package utils
6 |
7 | const (
8 | NetworkProjectIDLabel = "network.app.edge-orchestrator.intel.com/project-id"
9 | InterconnectProjectIDLabel = "interconnect.app.edge-orchestrator.intel.com/project-id"
10 | AppOrchProjectIDLabel = "app.edge-orchestrator.intel.com/project-id"
11 | )
12 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/NOTE.md:
--------------------------------------------------------------------------------
1 |
5 |
6 | # Skupper Client Modifications
7 |
8 | We have modified the Skupper client code, originally hosted at [Skupper client], to enforce a robust
9 | cryptographic algorithm and address Kubernetes dependency issues.
10 | These enhancements ensure improved security and compatibility,
11 | making the client more reliable and efficient for our specific use cases.
12 |
13 | [Skupper client]: https://github.com/skupperproject/skupper/tree/v1/client
14 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/api/types/crds/skupper_cluster_policy_cr_sample_01.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: skupper.io/v1alpha1
2 | kind: SkupperClusterPolicy
3 | metadata:
4 | name: cluster-policy-sample-01
5 | spec:
6 | namespaces:
7 | - "*"
8 | allowIncomingLinks: true
9 | allowedExposedResources:
10 | - "*"
11 | allowedOutgoingLinksHostnames: []
12 | allowedServices:
13 | - "*"
14 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/api/types/crds/skupper_cluster_policy_cr_sample_02.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: skupper.io/v1alpha1
2 | kind: SkupperClusterPolicy
3 | metadata:
4 | name: cluster-policy-sample-02
5 | spec:
6 | namespaces:
7 | - "ns1"
8 | - "ns2"
9 | - "ns3"
10 | allowIncomingLinks: true
11 | allowedOutgoingLinksHostnames: ["*"]
12 | allowedExposedResources: []
13 | allowedServices:
14 | - "my-app-a"
15 | - "my-app-b"
16 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/api/types/crds/skupper_cluster_policy_cr_sample_03.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: skupper.io/v1alpha1
2 | kind: SkupperClusterPolicy
3 | metadata:
4 | name: cluster-policy-sample-03
5 | spec:
6 | namespaces:
7 | - "ns4"
8 | - "ns5"
9 | - "ns6"
10 | allowIncomingLinks: true
11 | allowedOutgoingLinksHostnames: ["*"]
12 | allowedExposedResources: ["*"]
13 | allowedServices: ["*"]
14 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/client_mock_test.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "k8s.io/client-go/kubernetes/fake"
5 | )
6 |
7 | func newMockClient(namespace string, context string, kubeConfigPath string) (*VanClient, error) {
8 | return &VanClient{
9 | Namespace: namespace,
10 | KubeClient: fake.NewSimpleClientset(),
11 | }, nil
12 | }
13 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/client_test.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "flag"
5 | "os"
6 | "sort"
7 | "testing"
8 |
9 | "github.com/google/go-cmp/cmp"
10 | "gotest.tools/assert"
11 | )
12 |
13 | var trans = cmp.Transformer("Sort", func(in []string) []string {
14 | out := append([]string(nil), in...)
15 | sort.Strings(out)
16 | return out
17 | })
18 |
19 | func TestNewClient(t *testing.T) {
20 | testcases := []struct {
21 | doc string
22 | namespace string
23 | context string
24 | kubeConfigPath string
25 | expectedError string
26 | expectedVersion string
27 | }{
28 | {
29 | namespace: "skupper",
30 | context: "",
31 | kubeConfigPath: "",
32 | expectedError: "",
33 | doc: "test one",
34 | },
35 | }
36 |
37 | for _, c := range testcases {
38 | _, err := newMockClient(c.namespace, c.context, c.kubeConfigPath)
39 | assert.Check(t, err, c.doc)
40 | }
41 | }
42 |
43 | var clusterRun = flag.Bool("use-cluster", false, "run tests against a configured cluster")
44 |
45 | func TestMain(m *testing.M) {
46 | flag.Parse()
47 | os.Exit(m.Run())
48 | }
49 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/connector_inspect.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "context"
5 |
6 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/qdr"
7 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8 |
9 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
10 | kubeqdr "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/kube/qdr"
11 | )
12 |
13 | // ConnectorInspect VAN connector instance
14 | func (cli *VanClient) ConnectorInspect(ctx context.Context, name string) (*types.LinkStatus, error) {
15 | current, err := cli.getRouterConfig(ctx, "")
16 | if err != nil {
17 | return nil, err
18 | }
19 | secret, err := cli.KubeClient.CoreV1().Secrets(cli.Namespace).Get(ctx, name, metav1.GetOptions{})
20 | if err != nil {
21 | return nil, err
22 | }
23 | connections, _ := kubeqdr.GetConnections(cli.Namespace, cli.KubeClient, cli.RestConfig)
24 | link := qdr.GetLinkStatus(secret, current.IsEdge(), connections)
25 | return &link, nil
26 | }
27 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/container/informer.go:
--------------------------------------------------------------------------------
1 | package container
2 |
3 | type Informer[T any] interface {
4 | OnAdd(obj T)
5 | OnUpdate(oldObj, newObj T)
6 | OnDelete(obj T)
7 | }
8 |
9 | type InformerBase[T any] struct {
10 | Add func(obj T)
11 | Update func(oldObj, newObj T)
12 | Delete func(obj T)
13 | }
14 |
15 | func (e *InformerBase[T]) OnAdd(obj T) {
16 | e.Add(obj)
17 | }
18 |
19 | func (e *InformerBase[T]) OnUpdate(oldObj, newObj T) {
20 | e.Update(oldObj, newObj)
21 | }
22 |
23 | func (e *InformerBase[T]) OnDelete(obj T) {
24 | e.Delete(obj)
25 | }
26 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/cgroup_spec.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // CgroupSpec CgroupSpec represents the cgroup to use for the container.
15 | //
16 | // swagger:model CgroupSpec
17 | type CgroupSpec string
18 |
19 | // Validate validates this cgroup spec
20 | func (m CgroupSpec) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this cgroup spec based on context it is used
25 | func (m CgroupSpec) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/cgroupns_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // CgroupnsMode CgroupnsMode represents the cgroup namespace mode of the container
15 | //
16 | // swagger:model CgroupnsMode
17 | type CgroupnsMode string
18 |
19 | // Validate validates this cgroupns mode
20 | func (m CgroupnsMode) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this cgroupns mode based on context it is used
25 | func (m CgroupnsMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/consistency.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // Consistency Consistency represents the consistency requirements of a mount.
15 | //
16 | // swagger:model Consistency
17 | type Consistency string
18 |
19 | // Validate validates this consistency
20 | func (m Consistency) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this consistency based on context it is used
25 | func (m Consistency) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/digest.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // Digest Digest allows simple protection of hex formatted digest strings, prefixed
15 | // by their algorithm. Strings of type Digest have some guarantee of being in
16 | // the correct format and it provides quick access to the components of a
17 | // digest string.
18 | //
19 | // The following is an example of the contents of Digest types:
20 | //
21 | // sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc
22 | //
23 | // This allows to abstract the digest behind this type and work only in those
24 | // terms.
25 | //
26 | // swagger:model Digest
27 | type Digest string
28 |
29 | // Validate validates this digest
30 | func (m Digest) Validate(formats strfmt.Registry) error {
31 | return nil
32 | }
33 |
34 | // ContextValidate validates this digest based on context it is used
35 | func (m Digest) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
36 | return nil
37 | }
38 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/duration.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // Duration A Duration represents the elapsed time between two instants
15 | // as an int64 nanosecond count. The representation limits the
16 | // largest representable duration to approximately 290 years.
17 | //
18 | // swagger:model Duration
19 | type Duration int64
20 |
21 | // Validate validates this duration
22 | func (m Duration) Validate(formats strfmt.Registry) error {
23 | return nil
24 | }
25 |
26 | // ContextValidate validates this duration based on context it is used
27 | func (m Duration) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
28 | return nil
29 | }
30 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/file_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // FileMode A FileMode represents a file's mode and permission bits.
15 | //
16 | // The bits have the same definition on all systems, so that
17 | // information about files can be moved from one system
18 | // to another portably. Not all bits apply to all systems.
19 | // The only required bit is ModeDir for directories.
20 | //
21 | // swagger:model FileMode
22 | type FileMode uint32
23 |
24 | // Validate validates this file mode
25 | func (m FileMode) Validate(formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
29 | // ContextValidate validates this file mode based on context it is used
30 | func (m FileMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
31 | return nil
32 | }
33 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/hardware_addr.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // HardwareAddr A HardwareAddr represents a physical hardware address.
15 | //
16 | // swagger:model HardwareAddr
17 | type HardwareAddr []uint8
18 |
19 | // Validate validates this hardware addr
20 | func (m HardwareAddr) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this hardware addr based on context it is used
25 | func (m HardwareAddr) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/id_response.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | "github.com/go-openapi/swag"
13 | )
14 |
15 | // IDResponse ID response
16 | //
17 | // swagger:model IDResponse
18 | type IDResponse struct {
19 |
20 | // ID
21 | ID string `json:"Id,omitempty"`
22 | }
23 |
24 | // Validate validates this ID response
25 | func (m *IDResponse) Validate(formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
29 | // ContextValidate validates this ID response based on context it is used
30 | func (m *IDResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
31 | return nil
32 | }
33 |
34 | // MarshalBinary interface implementation
35 | func (m *IDResponse) MarshalBinary() ([]byte, error) {
36 | if m == nil {
37 | return nil, nil
38 | }
39 | return swag.WriteJSON(m)
40 | }
41 |
42 | // UnmarshalBinary interface implementation
43 | func (m *IDResponse) UnmarshalBinary(b []byte) error {
44 | var res IDResponse
45 | if err := swag.ReadJSON(b, &res); err != nil {
46 | return err
47 | }
48 | *m = res
49 | return nil
50 | }
51 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/ip.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // IP An IP is a single IP address, a slice of bytes.
15 | // Functions in this package accept either 4-byte (IPv4)
16 | // or 16-byte (IPv6) slices as input.
17 | //
18 | // Note that in this documentation, referring to an
19 | // IP address as an IPv4 address or an IPv6 address
20 | // is a semantic property of the address, not just the
21 | // length of the byte slice: a 16-byte slice can still
22 | // be an IPv4 address.
23 | //
24 | // swagger:model IP
25 | type IP []uint8
26 |
27 | // Validate validates this IP
28 | func (m IP) Validate(formats strfmt.Registry) error {
29 | return nil
30 | }
31 |
32 | // ContextValidate validates this IP based on context it is used
33 | func (m IP) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
34 | return nil
35 | }
36 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/ip_mask.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // IPMask An IPMask is a bitmask that can be used to manipulate
15 | // IP addresses for IP addressing and routing.
16 | //
17 | // See type IPNet and func ParseCIDR for details.
18 | //
19 | // swagger:model IPMask
20 | type IPMask []uint8
21 |
22 | // Validate validates this IP mask
23 | func (m IPMask) Validate(formats strfmt.Registry) error {
24 | return nil
25 | }
26 |
27 | // ContextValidate validates this IP mask based on context it is used
28 | func (m IPMask) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
29 | return nil
30 | }
31 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/ipc_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // IpcMode IpcMode represents the container ipc stack.
15 | //
16 | // swagger:model IpcMode
17 | type IpcMode string
18 |
19 | // Validate validates this ipc mode
20 | func (m IpcMode) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this ipc mode based on context it is used
25 | func (m IpcMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/isolation.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // Isolation Isolation represents the isolation technology of a container. The supported
15 | // values are platform specific
16 | //
17 | // swagger:model Isolation
18 | type Isolation string
19 |
20 | // Validate validates this isolation
21 | func (m Isolation) Validate(formats strfmt.Registry) error {
22 | return nil
23 | }
24 |
25 | // ContextValidate validates this isolation based on context it is used
26 | func (m Isolation) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
27 | return nil
28 | }
29 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/linux_personality_domain.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // LinuxPersonalityDomain LinuxPersonalityDomain refers to a personality domain.
15 | //
16 | // swagger:model LinuxPersonalityDomain
17 | type LinuxPersonalityDomain string
18 |
19 | // Validate validates this linux personality domain
20 | func (m LinuxPersonalityDomain) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this linux personality domain based on context it is used
25 | func (m LinuxPersonalityDomain) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/linux_personality_flag.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // LinuxPersonalityFlag LinuxPersonalityFlag refers to an additional personality flag. None are currently defined.
15 | //
16 | // swagger:model LinuxPersonalityFlag
17 | type LinuxPersonalityFlag string
18 |
19 | // Validate validates this linux personality flag
20 | func (m LinuxPersonalityFlag) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this linux personality flag based on context it is used
25 | func (m LinuxPersonalityFlag) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/mac_address.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | // MacAddress mac address
9 | //
10 | // swagger:model MacAddress
11 | type MacAddress = HardwareAddr
12 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/manifest_remove_options.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | // ManifestRemoveOptions ManifestRemoveOptions provides the model for removing digests from a manifest
9 | //
10 | // swagger:model ManifestRemoveOptions
11 | type ManifestRemoveOptions interface{}
12 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/namespace_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // NamespaceMode namespace mode
15 | //
16 | // swagger:model NamespaceMode
17 | type NamespaceMode string
18 |
19 | // Validate validates this namespace mode
20 | func (m NamespaceMode) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this namespace mode based on context it is used
25 | func (m NamespaceMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/network_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // NetworkMode NetworkMode represents the container network stack.
15 | //
16 | // swagger:model NetworkMode
17 | type NetworkMode string
18 |
19 | // Validate validates this network mode
20 | func (m NetworkMode) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this network mode based on context it is used
25 | func (m NetworkMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/pid_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // PidMode PidMode represents the pid namespace of the container.
15 | //
16 | // swagger:model PidMode
17 | type PidMode string
18 |
19 | // Validate validates this pid mode
20 | func (m PidMode) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this pid mode based on context it is used
25 | func (m PidMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/port_set.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // PortSet PortSet is a collection of structs indexed by Port
15 | //
16 | // swagger:model PortSet
17 | type PortSet map[string]interface{}
18 |
19 | // Validate validates this port set
20 | func (m PortSet) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this port set based on context it is used
25 | func (m PortSet) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/propagation.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // Propagation Propagation represents the propagation of a mount.
15 | //
16 | // swagger:model Propagation
17 | type Propagation string
18 |
19 | // Validate validates this propagation
20 | func (m Propagation) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this propagation based on context it is used
25 | func (m Propagation) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/signal.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // Signal A Signal is a number describing a process signal.
15 | //
16 | // It implements the os.Signal interface.
17 | //
18 | // swagger:model Signal
19 | type Signal int64
20 |
21 | // Validate validates this signal
22 | func (m Signal) Validate(formats strfmt.Registry) error {
23 | return nil
24 | }
25 |
26 | // ContextValidate validates this signal based on context it is used
27 | func (m Signal) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
28 | return nil
29 | }
30 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/str_slice.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // StrSlice StrSlice represents a string or an array of strings.
15 | //
16 | // We need to override the json decoder to accept both options.
17 | //
18 | // swagger:model StrSlice
19 | type StrSlice []string
20 |
21 | // Validate validates this str slice
22 | func (m StrSlice) Validate(formats strfmt.Registry) error {
23 | return nil
24 | }
25 |
26 | // ContextValidate validates this str slice based on context it is used
27 | func (m StrSlice) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
28 | return nil
29 | }
30 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/type.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // Type Type represents the type of a mount.
15 | //
16 | // swagger:model Type
17 | type Type string
18 |
19 | // Validate validates this type
20 | func (m Type) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this type based on context it is used
25 | func (m Type) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/u_t_s_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // UTSMode UTSMode represents the UTS namespace of the container.
15 | //
16 | // swagger:model UTSMode
17 | type UTSMode string
18 |
19 | // Validate validates this u t s mode
20 | func (m UTSMode) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this u t s mode based on context it is used
25 | func (m UTSMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/generated/libpod/models/userns_mode.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-swagger; DO NOT EDIT.
2 |
3 | package models
4 |
5 | // This file was generated by the swagger tool.
6 | // Editing this file might prove futile when you re-run the swagger generate command
7 |
8 | import (
9 | "context"
10 |
11 | "github.com/go-openapi/strfmt"
12 | )
13 |
14 | // UsernsMode UsernsMode represents userns mode in the container.
15 | //
16 | // swagger:model UsernsMode
17 | type UsernsMode string
18 |
19 | // Validate validates this userns mode
20 | func (m UsernsMode) Validate(formats strfmt.Registry) error {
21 | return nil
22 | }
23 |
24 | // ContextValidate validates this userns mode based on context it is used
25 | func (m UsernsMode) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
26 | return nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/labels.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | const (
4 | ValidRfc1123Label = `^(` + ValidRfc1123LabelKey + `)+=(` + ValidRfc1123LabelValue + `)+(,(` + ValidRfc1123LabelKey + `)+=(` + ValidRfc1123LabelValue + `)+)*$`
5 | ValidRfc1123LabelKey = "[a-z0-9]([-._a-z0-9]*[a-z0-9])*"
6 | ValidRfc1123LabelValue = "[a-zA-Z0-9]([-._a-zA-Z0-9]*[a-zA-Z0-9])*"
7 | DefaultSkupperExtraLabels string = ""
8 | )
9 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/podman/version.go:
--------------------------------------------------------------------------------
1 | package podman
2 |
3 | import (
4 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/client/container"
5 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/client/generated/libpod/client/system"
6 | )
7 |
8 | func (p *PodmanRestClient) Version() (*container.Version, error) {
9 | systemCli := system.New(p.RestClient, formats)
10 | info, err := systemCli.SystemInfoLibpod(system.NewSystemInfoLibpodParams())
11 | if err != nil {
12 | return nil, err
13 | }
14 | v := &container.Version{}
15 | if info.Payload.Version != nil {
16 | v.Server = container.VersionInfo{
17 | Version: info.Payload.Version.Version,
18 | APIVersion: info.Payload.Version.APIVersion,
19 | }
20 | v.Hostname = info.Payload.Host.Hostname
21 | v.Arch = info.Payload.Host.Arch
22 | v.Kernel = info.Payload.Host.Kernel
23 | v.OS = info.Payload.Host.OS
24 | }
25 |
26 | return v, nil
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/router_remove.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "context"
5 | "fmt"
6 |
7 | "k8s.io/apimachinery/pkg/api/errors"
8 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9 |
10 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
11 | )
12 |
13 | // RouterRemove delete a VAN (router and controller) deployment
14 | func (cli *VanClient) RouterRemove(ctx context.Context) error {
15 | err := cli.KubeClient.AppsV1().Deployments(cli.Namespace).Delete(ctx, types.TransportDeploymentName, metav1.DeleteOptions{})
16 | if err != nil {
17 | if errors.IsNotFound(err) {
18 | return fmt.Errorf("Skupper not installed in '"+cli.Namespace+"': %w", err)
19 | } else {
20 | return fmt.Errorf("Error while trying to delete: %w", err)
21 | }
22 | }
23 | return nil
24 | }
25 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/serviceinterface_create.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "context"
5 | "fmt"
6 |
7 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
8 | "k8s.io/apimachinery/pkg/api/errors"
9 | )
10 |
11 | func (cli *VanClient) ServiceInterfaceCreate(ctx context.Context, service *types.ServiceInterface) error {
12 | policy := NewPolicyValidatorAPI(cli)
13 | res, err := policy.Service(service.Address)
14 | if err != nil {
15 | return err
16 | }
17 | if !res.Allowed {
18 | return res.Err()
19 | }
20 | owner, err := getRootObject(cli)
21 | if err == nil {
22 | err = validateServiceInterface(service, cli)
23 | if err != nil {
24 | return err
25 | }
26 |
27 | return updateServiceInterface(service, false, owner, cli)
28 | } else if errors.IsNotFound(err) {
29 | return fmt.Errorf("Skupper is not enabled in namespace '%s'", cli.Namespace)
30 | } else {
31 | return err
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/serviceinterface_inspect.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "context"
5 | jsonencoding "encoding/json"
6 | "fmt"
7 |
8 | "k8s.io/apimachinery/pkg/api/errors"
9 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10 |
11 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
12 | )
13 |
14 | func (cli *VanClient) ServiceInterfaceInspect(ctx context.Context, address string) (*types.ServiceInterface, error) {
15 | current, err := cli.KubeClient.CoreV1().ConfigMaps(cli.Namespace).Get(ctx, types.ServiceInterfaceConfigMap, metav1.GetOptions{})
16 | if err == nil {
17 | jsonDef := current.Data[address]
18 | if jsonDef == "" {
19 | return nil, nil
20 | } else {
21 | service := types.ServiceInterface{}
22 | err = jsonencoding.Unmarshal([]byte(jsonDef), &service)
23 | if err != nil {
24 | return nil, fmt.Errorf("Failed to read json for service definition %s: %s", address, err)
25 | } else {
26 | return &service, nil
27 | }
28 | }
29 | } else if errors.IsNotFound(err) {
30 | return nil, nil
31 | } else {
32 | return nil, fmt.Errorf("Could not retrieve service interface definition: %s", err)
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/serviceinterface_list.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "context"
5 | jsonencoding "encoding/json"
6 |
7 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8 |
9 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
10 | )
11 |
12 | func (cli *VanClient) ServiceInterfaceList(ctx context.Context) ([]*types.ServiceInterface, error) {
13 | var vsis []*types.ServiceInterface
14 |
15 | current, err := cli.KubeClient.CoreV1().ConfigMaps(cli.Namespace).Get(ctx, types.ServiceInterfaceConfigMap, metav1.GetOptions{})
16 | if err == nil {
17 | for _, v := range current.Data {
18 | if v != "" {
19 | si := types.ServiceInterface{}
20 | err = jsonencoding.Unmarshal([]byte(v), &si)
21 | if err != nil {
22 | return vsis, err
23 | } else {
24 | vsis = append(vsis, &si)
25 | }
26 | }
27 | }
28 | return vsis, nil
29 | } else {
30 | return vsis, err
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/site_config_create.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "context"
5 | "fmt"
6 |
7 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8 |
9 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
10 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/site"
11 | )
12 |
13 | func (cli *VanClient) SiteConfigCreate(ctx context.Context, spec types.SiteConfigSpec) (*types.SiteConfig, error) {
14 | siteConfig, err := site.WriteSiteConfig(spec, cli.Namespace)
15 | if err != nil {
16 | return nil, err
17 | }
18 | if spec.IsIngressRoute() && cli.RouteClient == nil {
19 | return nil, fmt.Errorf("OpenShift cluster not detected for --ingress type route")
20 | }
21 |
22 | actual, err := cli.KubeClient.CoreV1().ConfigMaps(cli.Namespace).Create(ctx, siteConfig, metav1.CreateOptions{})
23 | if err != nil {
24 | return nil, err
25 | }
26 | if actual.TypeMeta.Kind == "" || actual.TypeMeta.APIVersion == "" { // why??
27 | actual.TypeMeta = siteConfig.TypeMeta
28 | }
29 | return cli.SiteConfigInspect(ctx, actual)
30 | }
31 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/site_config_remove.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "context"
5 |
6 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
7 |
8 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
9 | )
10 |
11 | func (cli *VanClient) SiteConfigRemove(ctx context.Context) error {
12 | return cli.KubeClient.CoreV1().ConfigMaps(cli.Namespace).Delete(ctx, types.SiteConfigMapName, metav1.DeleteOptions{})
13 | }
14 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/client/utils.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "hash/crc32"
5 | "sort"
6 | "strings"
7 |
8 | rbacv1 "k8s.io/api/rbac/v1"
9 | )
10 |
11 | func ContainsAllPolicies(elements []rbacv1.PolicyRule, included []rbacv1.PolicyRule) bool {
12 | if nil == elements || nil == included {
13 | return false
14 | }
15 | getHashedRules := func(rules []rbacv1.PolicyRule) []uint32 {
16 | var hashedRules []uint32
17 | for _, inc := range rules {
18 | var resources []string
19 | resources = append(resources, inc.Resources...)
20 | resources = append(resources, inc.Verbs...)
21 | resources = append(resources, inc.APIGroups...)
22 | sort.Strings(resources)
23 | str := strings.Join(resources, "")
24 | hashedRules = append(hashedRules, crc32.ChecksumIEEE([]byte(str)))
25 | }
26 | return hashedRules
27 | }
28 | hashedIncluded := getHashedRules(included)
29 | hashedElements := getHashedRules(elements)
30 |
31 | for _, el := range hashedElements {
32 | if !Contains(hashedIncluded, el) {
33 | return false
34 | }
35 | }
36 | return true
37 | }
38 |
39 | func Contains(elements []uint32, element uint32) bool {
40 | for _, el := range elements {
41 | if el == element {
42 | return true
43 | }
44 | }
45 | return false
46 | }
47 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/apis/skupper/register.go:
--------------------------------------------------------------------------------
1 | package skupper
2 |
3 | const (
4 | GroupName = "skupper.io"
5 | )
6 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/apis/skupper/v1alpha1/doc.go:
--------------------------------------------------------------------------------
1 | // +k8s:deepcopy-gen=package
2 | // +groupName=skupper.io
3 |
4 | package v1alpha1 // import "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/apis/skupper/v1alpha1"
5 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/apis/skupper/v1alpha1/register.go:
--------------------------------------------------------------------------------
1 | package v1alpha1
2 |
3 | import (
4 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/apis/skupper"
5 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
6 | "k8s.io/apimachinery/pkg/runtime"
7 | "k8s.io/apimachinery/pkg/runtime/schema"
8 | )
9 |
10 | var SchemeGroupVersion = schema.GroupVersion{
11 | Group: skupper.GroupName,
12 | Version: "v1alpha1",
13 | }
14 |
15 | func Kind(kind string) schema.GroupKind {
16 | return SchemeGroupVersion.WithKind(kind).GroupKind()
17 | }
18 |
19 | func Resource(resource string) schema.GroupResource {
20 | return SchemeGroupVersion.WithResource(resource).GroupResource()
21 | }
22 |
23 | var (
24 | SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
25 | AddToScheme = SchemeBuilder.AddToScheme
26 | )
27 |
28 | func addKnownTypes(scheme *runtime.Scheme) error {
29 | scheme.AddKnownTypes(SchemeGroupVersion, &SkupperClusterPolicy{}, &SkupperClusterPolicyList{})
30 | metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
31 | return nil
32 | }
33 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/apis/skupper/v1alpha1/types.go:
--------------------------------------------------------------------------------
1 | package v1alpha1
2 |
3 | import (
4 | v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
5 | )
6 |
7 | // +genclient
8 | // +genclient:noStatus
9 | // +genclient:nonNamespaced
10 | // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
11 |
12 | // SkupperClusterPolicy defines optional cluster level policies
13 | type SkupperClusterPolicy struct {
14 | v1.TypeMeta `json:",inline"`
15 | v1.ObjectMeta `json:"metadata,omitempty"`
16 | Spec SkupperClusterPolicySpec `json:"spec,omitempty"`
17 | }
18 |
19 | // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
20 |
21 | // SkupperClusterPolicyList contains a List of SkupperClusterPolicy
22 | type SkupperClusterPolicyList struct {
23 | v1.TypeMeta `json:",inline"`
24 | v1.ListMeta `json:"metadata,omitempty"`
25 | Items []SkupperClusterPolicy `json:"items"`
26 | }
27 |
28 | type SkupperClusterPolicySpec struct {
29 | Namespaces []string `json:"namespaces"`
30 | AllowIncomingLinks bool `json:"allowIncomingLinks"`
31 | AllowedOutgoingLinksHostnames []string `json:"allowedOutgoingLinksHostnames"`
32 | AllowedExposedResources []string `json:"allowedExposedResources"`
33 | AllowedServices []string `json:"allowedServices"`
34 | }
35 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/cleanhttp/cleanhttp.go:
--------------------------------------------------------------------------------
1 | // cleanhttp has convenience functions for creating clean http clients and
2 | // transports - free of the globally mutable state in http.DefaultClient and
3 | // http.DefaultTransport variables.
4 | package cleanhttp
5 |
6 | import (
7 | "net"
8 | "net/http"
9 | "time"
10 | )
11 |
12 | // DefaultClient returns a clean http Client using the same defaults as go's
13 | // http.DefaultClient without relying on global state shared with other
14 | // clients.
15 | func DefaultClient() *http.Client {
16 | return &http.Client{
17 | Transport: DefaultTransport(),
18 | }
19 | }
20 |
21 | // DefaultTransport returns a clean http Transport with the same defaults as
22 | // go's http.DefaultTransport.
23 | func DefaultTransport() *http.Transport {
24 | transport := &http.Transport{
25 | Proxy: http.ProxyFromEnvironment,
26 | DialContext: (&net.Dialer{
27 | Timeout: 30 * time.Second,
28 | KeepAlive: 30 * time.Second,
29 | }).DialContext,
30 | ForceAttemptHTTP2: true,
31 | MaxIdleConns: 100,
32 | IdleConnTimeout: 90 * time.Second,
33 | TLSHandshakeTimeout: 10 * time.Second,
34 | ExpectContinueTimeout: 1 * time.Second,
35 | }
36 | return transport
37 | }
38 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/config/prometheus-web-config.yml.template:
--------------------------------------------------------------------------------
1 | # TLS configuration.
2 | #{{- if .TlsAuth }}
3 | #tls_server_config:
4 | # cert_file: /etc/tls/certs/tls.crt
5 | # key_file: /etc/tls/certs/tls.key
6 | #{{- end}}
7 | #
8 | # Usernames and passwords required to connect to Prometheus.
9 | # Passwords are hashed with bcrypt: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md#about-bcrypt
10 | #basic_auth_users:
11 | {{- if .BasicAuth}}
12 | # {{.User}}: {{.Hash}}
13 | {{- end}}
14 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/config/prometheus.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "bytes"
5 | _ "embed"
6 | "text/template"
7 |
8 | "golang.org/x/crypto/bcrypt"
9 | )
10 |
11 | var (
12 | //go:embed prometheus.yml.template
13 | PrometheusConfig string
14 |
15 | //go:embed prometheus-web-config.yml.template
16 | WebConfigForPrometheus string
17 | )
18 |
19 | type PrometheusInfo struct {
20 | BasicAuth bool
21 | TlsAuth bool
22 | ServiceName string
23 | Namespace string
24 | Port string
25 | User string
26 | Password string
27 | Hash string
28 | }
29 |
30 | func ScrapeConfigForPrometheus(info PrometheusInfo) string {
31 | var buf bytes.Buffer
32 | promConfig := template.Must(template.New("promConfig").Parse(PrometheusConfig))
33 | promConfig.Execute(&buf, info)
34 |
35 | return buf.String()
36 | }
37 |
38 | func ScrapeWebConfigForPrometheus(info PrometheusInfo) string {
39 | var buf bytes.Buffer
40 | promConfig := template.Must(template.New("prmConfig").Parse(WebConfigForPrometheus))
41 | promConfig.Execute(&buf, info)
42 |
43 | return buf.String()
44 | }
45 |
46 | func HashPrometheusPassword(password string) ([]byte, error) {
47 | return bcrypt.GenerateFromPassword([]byte(password), 14)
48 | }
49 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/config/prometheus.yml.template:
--------------------------------------------------------------------------------
1 | global:
2 | scrape_interval: 15s
3 | evaluation_interval: 15s
4 | alerting:
5 | alertmanagers:
6 | - static_configs:
7 | - targets:
8 | rule_files:
9 | # - "example-file.yml"
10 | scrape_configs:
11 | - job_name: 'prometheus'
12 | metrics_path: "/api/v1alpha1/metrics"
13 | scheme: "https"
14 | tls_config:
15 | insecure_skip_verify: true
16 | static_configs:
17 | {{- if .Namespace}}
18 | - targets: ["{{.ServiceName}}.{{.Namespace}}.svc.cluster.local:{{.Port}}"]
19 | {{- else}}
20 | - targets: ["{{.ServiceName}}:{{.Port}}"]
21 | {{- end}}
22 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/config/startsh-podman.template:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | set -o errexit
4 | set -o nounset
5 |
6 | for container in $(podman container ls --filter label=application=skupper --format {{.Names}} --all); do
7 | podman start ${container}
8 | done
9 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/config/stopsh-podman.template:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | set -o errexit
4 | set -o nounset
5 |
6 | for container in $(podman container ls --filter label=application=skupper --format {{.Names}} --all); do
7 | podman stop -t 10 ${container}
8 | done
9 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/config/systemd_service.template:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=skupper-{{.Platform}}.service
3 | Wants=network-online.target
4 | After=network-online.target
5 | RequiresMountsFor={{.RuntimeDir}}/containers
6 |
7 | [Service]
8 | TimeoutStopSec=70
9 | RemainAfterExit=yes
10 | ExecStart={{.DataHomeDir}}/start-{{.Platform}}.sh
11 | ExecStop={{.DataHomeDir}}/stop-{{.Platform}}.sh
12 | Type=simple
13 |
14 | [Install]
15 | WantedBy=default.target
16 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/data/site.go:
--------------------------------------------------------------------------------
1 | package data
2 |
3 | type Site struct {
4 | SiteName string `json:"site_name"`
5 | SiteId string `json:"site_id"`
6 | Version string `json:"version"`
7 | Platform string `json:"platform"`
8 | Connected []string `json:"connected"`
9 | Namespace string `json:"namespace"`
10 | Url string `json:"url"`
11 | Edge bool `json:"edge"`
12 | Gateway bool `json:"gateway"`
13 | }
14 |
15 | func (s *Site) IsConnectedTo(siteId string) bool {
16 | for _, value := range s.Connected {
17 | if value == siteId {
18 | return true
19 | }
20 | }
21 | return false
22 | }
23 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/domain/podman/common.go:
--------------------------------------------------------------------------------
1 | package podman
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/utils"
7 |
8 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
9 | )
10 |
11 | const (
12 | SharedTlsCertificates = "skupper-router-certs"
13 | )
14 |
15 | var (
16 | Username = utils.ReadUsername()
17 | SkupperContainerVolumes = []string{
18 | "skupper-services",
19 | "skupper-local-server",
20 | "skupper-internal",
21 | "skupper-site-server",
22 | SharedTlsCertificates,
23 | types.ConsoleServerSecret,
24 | types.ConsoleUsersSecret,
25 | types.NetworkStatusConfigMapName,
26 | "prometheus-server-config",
27 | "prometheus-storage-volume",
28 | }
29 | )
30 |
31 | func OwnedBySkupper(resource string, labels map[string]string) error {
32 | notOwnedErr := fmt.Errorf("%s is not owned by Skupper", resource)
33 | if labels == nil {
34 | return notOwnedErr
35 | }
36 | if app, ok := labels["application"]; !ok || app != types.AppName {
37 | return notOwnedErr
38 | }
39 | return nil
40 | }
41 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/domain/podman/ingress.go:
--------------------------------------------------------------------------------
1 | package podman
2 |
3 | import (
4 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/domain"
5 | )
6 |
7 | type SiteIngressHost struct {
8 | *domain.SiteIngressCommon
9 | }
10 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/domain/podman/local_config.go:
--------------------------------------------------------------------------------
1 | package podman
2 |
3 | import (
4 | "path"
5 |
6 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/config"
7 | )
8 |
9 | var (
10 | ConfigFile = path.Join(config.GetDataHome(), "podman.yaml")
11 | )
12 |
13 | type Config struct {
14 | Endpoint string `yaml:"endpoint"`
15 | }
16 |
17 | type configFileHandler struct {
18 | config *config.ConfigFileHandlerCommon
19 | }
20 |
21 | func (p *configFileHandler) GetConfig() (*Config, error) {
22 | err := p.config.Load()
23 | if err != nil {
24 | return nil, err
25 | }
26 | return p.config.GetData().(*Config), nil
27 | }
28 |
29 | func (p *configFileHandler) Save(config *Config) error {
30 | p.config.SetData(config)
31 | return p.config.Save()
32 | }
33 |
34 | func NewPodmanConfigFileHandler() *configFileHandler {
35 | c := &config.ConfigFileHandlerCommon{}
36 | c.SetFileName(ConfigFile)
37 | c.SetData(&Config{})
38 | p := &configFileHandler{config: c}
39 | return p
40 | }
41 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/domain/podman/skupper-services.json:
--------------------------------------------------------------------------------
1 | {"nginx":{"address":"nginx","protocol":"tcp","ports":[8080],"exposeIngress":"","targets":[{"name":"*domain.EgressResolverHost={\"host\":\"nginx\",\"ports\":{\"8080\":8080}}","targetPorts":{"8080":8080},"service":"nginx"}]}}
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/domain/router.go:
--------------------------------------------------------------------------------
1 | package domain
2 |
3 | import (
4 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/pkg/qdr"
5 | )
6 |
7 | // RouterEntityManager manipulates runtime entities
8 | type RouterEntityManager interface {
9 | CreateSslProfile(sslProfile qdr.SslProfile) error
10 | DeleteSslProfile(name string) error
11 | CreateConnector(connector qdr.Connector) error
12 | DeleteConnector(name string) error
13 | QueryAllRouters() ([]qdr.Router, error)
14 | QueryRouterNodes() ([]qdr.RouterNode, error)
15 | QueryEdgeRouters() ([]qdr.Router, error)
16 | QueryConnections(routerId string, edge bool) ([]qdr.Connection, error)
17 | CreateTcpConnector(tcpConnector qdr.TcpEndpoint) error
18 | DeleteTcpConnector(name string) error
19 | CreateHttpConnector(httpConnector qdr.HttpEndpoint) error
20 | DeleteHttpConnector(name string) error
21 | }
22 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/domain/skupper_deployment.go:
--------------------------------------------------------------------------------
1 | package domain
2 |
3 | import "context"
4 |
5 | type SkupperDeployment interface {
6 | GetName() string
7 | GetComponents() []SkupperComponent
8 | }
9 |
10 | type SkupperDeploymentHandler interface {
11 | Deploy(ctx context.Context, deployment SkupperDeployment) error
12 | List() ([]SkupperDeployment, error)
13 | Undeploy(name string) error
14 | }
15 |
16 | type SkupperDeploymentCommon struct {
17 | Components []SkupperComponent
18 | }
19 |
20 | func (s *SkupperDeploymentCommon) GetComponents() []SkupperComponent {
21 | return s.Components
22 | }
23 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/generated/client/clientset/versioned/doc.go:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2021 The Skupper Authors.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | // Code generated by client-gen. DO NOT EDIT.
18 |
19 | // This package has the automatically generated clientset.
20 | package versioned
21 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/generated/client/clientset/versioned/fake/doc.go:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2021 The Skupper Authors.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | // Code generated by client-gen. DO NOT EDIT.
18 |
19 | // This package has the automatically generated fake clientset.
20 | package fake
21 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/generated/client/clientset/versioned/scheme/doc.go:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2021 The Skupper Authors.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | // Code generated by client-gen. DO NOT EDIT.
18 |
19 | // This package contains the scheme of the automatically generated clientset.
20 | package scheme
21 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/generated/client/clientset/versioned/typed/skupper/v1alpha1/doc.go:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2021 The Skupper Authors.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | // Code generated by client-gen. DO NOT EDIT.
18 |
19 | // This package has the automatically generated typed clients.
20 | package v1alpha1
21 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/generated/client/clientset/versioned/typed/skupper/v1alpha1/fake/doc.go:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2021 The Skupper Authors.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | // Code generated by client-gen. DO NOT EDIT.
18 |
19 | // Package fake has the automatically generated clients.
20 | package fake
21 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/generated/client/clientset/versioned/typed/skupper/v1alpha1/generated_expansion.go:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2021 The Skupper Authors.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | // Code generated by client-gen. DO NOT EDIT.
18 |
19 | package v1alpha1
20 |
21 | type SkupperClusterPolicyExpansion interface{}
22 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/generated/client/listers/skupper/v1alpha1/expansion_generated.go:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2021 The Skupper Authors.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | // Code generated by lister-gen. DO NOT EDIT.
18 |
19 | package v1alpha1
20 |
21 | // SkupperClusterPolicyListerExpansion allows custom methods to be added to
22 | // SkupperClusterPolicyLister.
23 | type SkupperClusterPolicyListerExpansion interface{}
24 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/images/images.go:
--------------------------------------------------------------------------------
1 | package images
2 |
3 | const (
4 | DefaultImageRegistry string = "quay.io/skupper"
5 | RouterImageName string = "skupper-router:2.7.0"
6 | ServiceControllerImageName string = "service-controller:main"
7 | ControllerPodmanImageName string = "controller-podman:main"
8 | ConfigSyncImageName string = "config-sync:main"
9 | FlowCollectorImageName string = "flow-collector:main"
10 | SiteControllerImageName string = "site-controller:main"
11 | PrometheusImageRegistry string = "quay.io/prometheus"
12 | PrometheusServerImageName string = "prometheus:v2.42.0"
13 | OauthProxyImageRegistry string = "quay.io/openshift"
14 | OauthProxyImageName string = "origin-oauth-proxy:4.14.0"
15 | )
16 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/kube/clients.go:
--------------------------------------------------------------------------------
1 | /*
2 | Licensed under the Apache License, Version 2.0 (the "License");
3 | you may not use this file except in compliance with the License.
4 | You may obtain a copy of the License at
5 |
6 | http://www.apache.org/licenses/LICENSE-2.0
7 |
8 | Unless required by applicable law or agreed to in writing, software
9 | distributed under the License is distributed on an "AS IS" BASIS,
10 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 | See the License for the specific language governing permissions and
12 | limitations under the License.
13 | */
14 |
15 | package kube
16 |
17 | import (
18 | routev1client "github.com/openshift/client-go/route/clientset/versioned/typed/route/v1"
19 | "k8s.io/client-go/discovery"
20 | "k8s.io/client-go/dynamic"
21 | "k8s.io/client-go/kubernetes"
22 | )
23 |
24 | type Clients interface {
25 | GetKubeClient() kubernetes.Interface
26 | GetDynamicClient() dynamic.Interface
27 | GetDiscoveryClient() *discovery.DiscoveryClient
28 | GetRouteClient() *routev1client.RouteV1Client
29 | }
30 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/kube/clusterrolebindings.go:
--------------------------------------------------------------------------------
1 | package kube
2 |
3 | import (
4 | "context"
5 |
6 | rbacv1 "k8s.io/api/rbac/v1"
7 | "k8s.io/apimachinery/pkg/api/errors"
8 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9 | "k8s.io/client-go/kubernetes"
10 | )
11 |
12 | func CreateClusterRoleBinding(crb *rbacv1.ClusterRoleBinding, kubeclient kubernetes.Interface) (*rbacv1.ClusterRoleBinding, error) {
13 | clusterRoleBindings := kubeclient.RbacV1().ClusterRoleBindings()
14 | created, err := clusterRoleBindings.Create(context.TODO(), crb, metav1.CreateOptions{})
15 | if err != nil {
16 | return nil, err
17 | } else {
18 | return created, nil
19 | }
20 | }
21 |
22 | func DeleteClusterRoleBinding(name string, kubeclient kubernetes.Interface) (bool, error) {
23 | err := kubeclient.RbacV1().ClusterRoleBindings().Delete(context.TODO(), name, metav1.DeleteOptions{})
24 | if errors.IsNotFound(err) {
25 | return false, nil
26 | } else if err != nil {
27 | return false, err
28 | }
29 | return true, nil
30 | }
31 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/kube/deploymentconfigs.go:
--------------------------------------------------------------------------------
1 | package kube
2 |
3 | import (
4 | "context"
5 |
6 | appv1 "github.com/openshift/api/apps/v1"
7 | "github.com/openshift/client-go/apps/clientset/versioned"
8 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9 | )
10 |
11 | func GetDeploymentConfig(name string, namespace string, appsClient versioned.Interface) (*appv1.DeploymentConfig, error) {
12 | depConfig, err := appsClient.AppsV1().DeploymentConfigs(namespace).Get(context.TODO(), name, metav1.GetOptions{})
13 | return depConfig, err
14 | }
15 |
16 | func GetContainerPortForDeploymentConfig(deploymentConfig *appv1.DeploymentConfig) map[int]int {
17 | if len(deploymentConfig.Spec.Template.Spec.Containers) > 0 && len(deploymentConfig.Spec.Template.Spec.Containers[0].Ports) > 0 {
18 | return GetAllContainerPorts(deploymentConfig.Spec.Template.Spec.Containers[0])
19 | } else {
20 | return map[int]int{}
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/kube/rolebindings.go:
--------------------------------------------------------------------------------
1 | package kube
2 |
3 | import (
4 | "context"
5 |
6 | rbacv1 "k8s.io/api/rbac/v1"
7 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8 | "k8s.io/client-go/kubernetes"
9 | )
10 |
11 | func CreateRoleBinding(namespace string, rb *rbacv1.RoleBinding, kubeclient kubernetes.Interface) (*rbacv1.RoleBinding, error) {
12 | roleBindings := kubeclient.RbacV1().RoleBindings(namespace)
13 | created, err := roleBindings.Create(context.TODO(), rb, metav1.CreateOptions{})
14 | if err != nil {
15 | return nil, err
16 | } else {
17 | return created, nil
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/messaging/messaging.go:
--------------------------------------------------------------------------------
1 | package messaging
2 |
3 | import (
4 | amqp "github.com/interconnectedcloud/go-amqp"
5 | )
6 |
7 | type ConnectionFactory interface {
8 | Connect() (Connection, error)
9 | Url() string
10 | }
11 |
12 | type Connection interface {
13 | Sender(address string) (Sender, error)
14 | Receiver(address string, credit uint32) (Receiver, error)
15 | Close()
16 | }
17 |
18 | type Sender interface {
19 | Send(msg *amqp.Message) error
20 | Close() error
21 | }
22 |
23 | type Receiver interface {
24 | Receive() (*amqp.Message, error)
25 | Accept(*amqp.Message) error
26 | Close() error
27 | }
28 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/utils/configs/config.go:
--------------------------------------------------------------------------------
1 | package configs
2 |
3 | func ConnectJson(host string) string {
4 | connect_json := `
5 | {
6 | "scheme": "amqps",
7 | "host": "` + host + `",
8 | "port": "5671",
9 | "tls": {
10 | "ca": "/etc/messaging/ca.crt",
11 | "cert": "/etc/messaging/tls.crt",
12 | "key": "/etc/messaging/tls.key",
13 | "verify": true
14 | }
15 | }
16 | `
17 | return connect_json
18 | }
19 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/utils/formatter/map.go:
--------------------------------------------------------------------------------
1 | package formatter
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "sort"
7 | "text/tabwriter"
8 | )
9 |
10 | func PrintKeyValueMap(entries map[string]string) error {
11 | writer := new(tabwriter.Writer)
12 | writer.Init(os.Stdout, 8, 8, 0, '\t', 0)
13 | defer writer.Flush()
14 |
15 | keys := make([]string, 0, len(entries))
16 | for k := range entries {
17 | keys = append(keys, k)
18 | }
19 | sort.Strings(keys)
20 |
21 | _, err := fmt.Fprint(writer, "")
22 | if err != nil {
23 | return err
24 | }
25 |
26 | for _, key := range keys {
27 | _, err := fmt.Fprintf(writer, "\n %s\t%s\t", key, entries[key])
28 | if err != nil {
29 | return err
30 | }
31 | }
32 |
33 | return nil
34 | }
35 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/utils/spinner.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "time"
5 |
6 | "github.com/briandowns/spinner"
7 | )
8 |
9 | func NewSpinner(message string, maxRetries int, function func() error) error {
10 |
11 | spin := spinner.New(spinner.CharSets[9], 100*time.Millisecond, spinner.WithHiddenCursor(false))
12 | spin.Prefix = message
13 | spin.FinalMSG = message + "\n"
14 |
15 | spin.Start()
16 |
17 | err := RetryError(time.Second, maxRetries, function)
18 |
19 | spin.Stop()
20 |
21 | if err != nil {
22 | return err
23 | }
24 |
25 | return nil
26 | }
27 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/utils/tcp.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "fmt"
5 | "net"
6 | "strconv"
7 | )
8 |
9 | func TcpPortInUse(host string, port int) bool {
10 | address := net.JoinHostPort(host, strconv.Itoa(port))
11 | listener, err := net.Listen("tcp", address)
12 | if err != nil {
13 | return true
14 | }
15 | if listener != nil {
16 | _ = listener.Close()
17 | }
18 | return false
19 | }
20 |
21 | func TcpPortNextFree(startPort int) (int, error) {
22 | for port := startPort; port <= 65535; port++ {
23 | if !TcpPortInUse("", port) {
24 | return port, nil
25 | }
26 | }
27 | return 0, fmt.Errorf("no available ports found")
28 | }
29 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/utils/tlscfg/tls.go:
--------------------------------------------------------------------------------
1 | package tlscfg
2 |
3 | import "crypto/tls"
4 |
5 | var (
6 | tlsCiphers []uint16
7 | )
8 |
9 | func init() {
10 | tlsCiphers = make([]uint16, len(tls.CipherSuites()))
11 | for i, suite := range tls.CipherSuites() {
12 | tlsCiphers[i] = suite.ID
13 | }
14 | }
15 |
16 | // Modern TLS Configuration for when TLSv1.3 can be assumed (e.g. when only
17 | // internal clients are expected.)
18 | func Modern() *tls.Config {
19 | return &tls.Config{
20 | MinVersion: tls.VersionTLS13,
21 | }
22 | }
23 |
24 | // Default TLS Configuration excludes cipher suites implemented in crypto/tls
25 | // that have been marked insecure.
26 | func Default() *tls.Config {
27 | suites := make([]uint16, len(tlsCiphers))
28 | copy(suites, tlsCiphers)
29 | return &tls.Config{
30 | CipherSuites: suites,
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/pkg/version/version.go:
--------------------------------------------------------------------------------
1 | package version
2 |
3 | var Version = "undefined"
4 | var MinimumCompatibleVersion = "0.8.0"
5 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/test/utils/base/interrupt_handler.go:
--------------------------------------------------------------------------------
1 | package base
2 |
3 | import (
4 | "log"
5 | "os"
6 | "os/signal"
7 | "syscall"
8 | "testing"
9 | )
10 |
11 | // This indicates that an interrupt signal has been received at least once.
12 | // Functions can access it using IsTestInterrupted() to check whether they
13 | // should continue, or call StopIfInterrupted (if they have t *testing.T)
14 | var userInterrupted bool
15 |
16 | // HandleInterruptSignal runs the given fn in case
17 | // test execution was interrupted
18 | func HandleInterruptSignal(fn func()) {
19 | sigChannel := make(chan os.Signal, 1)
20 | signal.Notify(sigChannel, os.Interrupt, syscall.SIGTERM)
21 | go func() {
22 | <-sigChannel
23 | userInterrupted = true
24 | log.Printf("interrupt signal received")
25 | fn()
26 | }()
27 | }
28 |
29 | // Calls *testing.T.Fatalf if base.UserInterrupted is true
30 | // In other words, stop that test if someone hit Ctrl+C
31 | func StopIfInterrupted(t *testing.T) {
32 | if userInterrupted {
33 | t.Fatalf("Stopping test as user hit interrupt")
34 | }
35 | }
36 |
37 | func IsTestInterrupted() bool {
38 | return userInterrupted
39 | }
40 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/test/utils/constants/constants.go:
--------------------------------------------------------------------------------
1 | package constants
2 |
3 | import (
4 | "time"
5 |
6 | "github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/api/types"
7 | "k8s.io/apimachinery/pkg/util/wait"
8 | )
9 |
10 | const (
11 | // until this issue: https://github.com/open-edge-platform/app-orch-deployment/app-interconnect/internal/skupper/issues/163
12 | // is fixed, this is the best we can do
13 | SkupperServiceReadyPeriod time.Duration = 10 * time.Minute
14 | DefaultTick = 5 * time.Second
15 | ImagePullingAndResourceCreationTimeout = 10 * time.Minute
16 | TestSuiteTimeout = 20 * time.Minute
17 | NamespaceDeleteTimeout = 2 * time.Minute
18 | )
19 |
20 | var (
21 | DefaultRetry wait.Backoff = wait.Backoff{
22 | Steps: int(ImagePullingAndResourceCreationTimeout / DefaultTick),
23 | Duration: DefaultTick,
24 | }
25 | )
26 |
27 | func DefaultRouterOptions(spec *types.RouterOptions) types.RouterOptions {
28 | if spec == nil {
29 | spec = &types.RouterOptions{}
30 | }
31 |
32 | if spec.Logging == nil {
33 | spec.Logging = []types.RouterLogConfig{}
34 | }
35 | spec.Logging = append(spec.Logging, types.RouterLogConfig{Module: "DEFAULT", Level: "trace+"})
36 |
37 | return *spec
38 | }
39 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/test/utils/env/envvars.go:
--------------------------------------------------------------------------------
1 | // Package env defines environment variables to be used across integration
2 | // test suites. These variables do not need to be set, but when defined
3 | // they can modify the behavior of the test suites.
4 | package env
5 |
6 | const (
7 | Public1IngressHost = "PUBLIC_1_INGRESS_HOST"
8 | )
9 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/test/utils/k8s/pod.go:
--------------------------------------------------------------------------------
1 | package k8s
2 |
--------------------------------------------------------------------------------
/app-interconnect/internal/skupper/test/utils/string.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | // StrDefault helper function that returns value if not empty
4 | // otherwise returns dflt.
5 | func StrDefault(dflt string, values ...string) string {
6 | for _, value := range values {
7 | if len(value) > 0 {
8 | return value
9 | }
10 | }
11 | return dflt
12 | }
13 |
14 | // StrEmpty returns true if the given string is empty
15 | func StrEmpty(value string) bool {
16 | if value == "" {
17 | return true
18 | }
19 | return false
20 | }
21 |
22 | // StrIn returns true if the given value exists in values
23 | func StrIn(value string, values ...string) bool {
24 | for _, v := range values {
25 | if v == value {
26 | return true
27 | }
28 | }
29 | return false
30 | }
31 |
32 | // AllStrIn returns true if all values provided exist in slice
33 | func AllStrIn(slice []string, values ...string) bool {
34 | if len(values) == 0 {
35 | return false
36 | }
37 | for _, v := range values {
38 | if !StrIn(v, slice...) {
39 | return false
40 | }
41 | }
42 | return true
43 | }
44 |
--------------------------------------------------------------------------------
/app-interconnect/internal/utils/skupper/util.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package skupper
5 |
6 | const (
7 | DefaultSkupperNamespace = "interconnect"
8 | )
9 |
10 | const (
11 | IngressNone = "None"
12 | IngressLoadBalancer = "LoadBalancer"
13 | )
14 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/.keep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-edge-platform/app-orch-deployment/4b266a2dbd3f2373fb9856ba4cc42406f261f6f9/app-interconnect/pkg/.keep
--------------------------------------------------------------------------------
/app-interconnect/pkg/apis/apis.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package apis
5 |
6 | import (
7 | "k8s.io/apimachinery/pkg/runtime"
8 | )
9 |
10 | // AddToSchemes may be used to add all resources defined in the project to a Scheme
11 | var AddToSchemes runtime.SchemeBuilder
12 |
13 | // AddToScheme adds all Subject to the Scheme
14 | func AddToScheme(s *runtime.Scheme) error {
15 | return AddToSchemes.AddToScheme(s)
16 | }
17 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/apis/interconnect/v1alpha1/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | // Package v1alpha1 contains API Schema definitions for the v1alpha1 API group
5 | // +k8s:deepcopy-gen=package,register
6 | // +groupName=interconnect.app.edge-orchestrator.intel.com
7 | package v1alpha1
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/apis/network/v1alpha1/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | // Package v1alpha1 contains API Schema definitions for the v1alpha1 API group
5 | // +k8s:deepcopy-gen=package,register
6 | // +groupName=network.app.edge-orchestrator.intel.com
7 | package v1alpha1
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/fake/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | // This package has the automatically generated fake clientset.
7 | package fake
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/scheme/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | // This package contains the scheme of the automatically generated clientset.
7 | package scheme
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/interconnect/v1alpha1/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | // This package has the automatically generated typed clients.
7 | package v1alpha1
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/interconnect/v1alpha1/fake/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | // Package fake has the automatically generated clients.
7 | package fake
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/interconnect/v1alpha1/fake/fake_interconnect_client.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | package fake
7 |
8 | import (
9 | v1alpha1 "github.com/open-edge-platform/app-orch-deployment/app-interconnect/pkg/clientset/versioned/typed/interconnect/v1alpha1"
10 | rest "k8s.io/client-go/rest"
11 | testing "k8s.io/client-go/testing"
12 | )
13 |
14 | type FakeInterconnectV1alpha1 struct {
15 | *testing.Fake
16 | }
17 |
18 | func (c *FakeInterconnectV1alpha1) Clusters() v1alpha1.ClusterInterface {
19 | return &FakeClusters{c}
20 | }
21 |
22 | func (c *FakeInterconnectV1alpha1) Links() v1alpha1.LinkInterface {
23 | return &FakeLinks{c}
24 | }
25 |
26 | func (c *FakeInterconnectV1alpha1) Services() v1alpha1.ServiceInterface {
27 | return &FakeServices{c}
28 | }
29 |
30 | // RESTClient returns a RESTClient that is used to communicate
31 | // with API server by this client implementation.
32 | func (c *FakeInterconnectV1alpha1) RESTClient() rest.Interface {
33 | var ret *rest.RESTClient
34 | return ret
35 | }
36 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/interconnect/v1alpha1/generated_expansion.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | package v1alpha1
7 |
8 | type ClusterExpansion interface{}
9 |
10 | type LinkExpansion interface{}
11 |
12 | type ServiceExpansion interface{}
13 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/network/v1alpha1/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | // This package has the automatically generated typed clients.
7 | package v1alpha1
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/network/v1alpha1/fake/doc.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | // Package fake has the automatically generated clients.
7 | package fake
8 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/network/v1alpha1/fake/fake_network_client.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | package fake
7 |
8 | import (
9 | v1alpha1 "github.com/open-edge-platform/app-orch-deployment/app-interconnect/pkg/clientset/versioned/typed/network/v1alpha1"
10 | rest "k8s.io/client-go/rest"
11 | testing "k8s.io/client-go/testing"
12 | )
13 |
14 | type FakeNetworkV1alpha1 struct {
15 | *testing.Fake
16 | }
17 |
18 | func (c *FakeNetworkV1alpha1) Networks() v1alpha1.NetworkInterface {
19 | return &FakeNetworks{c}
20 | }
21 |
22 | func (c *FakeNetworkV1alpha1) NetworkClusters() v1alpha1.NetworkClusterInterface {
23 | return &FakeNetworkClusters{c}
24 | }
25 |
26 | func (c *FakeNetworkV1alpha1) NetworkLinks() v1alpha1.NetworkLinkInterface {
27 | return &FakeNetworkLinks{c}
28 | }
29 |
30 | func (c *FakeNetworkV1alpha1) NetworkServices() v1alpha1.NetworkServiceInterface {
31 | return &FakeNetworkServices{c}
32 | }
33 |
34 | // RESTClient returns a RESTClient that is used to communicate
35 | // with API server by this client implementation.
36 | func (c *FakeNetworkV1alpha1) RESTClient() rest.Interface {
37 | var ret *rest.RESTClient
38 | return ret
39 | }
40 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/clientset/versioned/typed/network/v1alpha1/generated_expansion.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by client-gen. DO NOT EDIT.
5 |
6 | package v1alpha1
7 |
8 | type NetworkExpansion interface{}
9 |
10 | type NetworkClusterExpansion interface{}
11 |
12 | type NetworkLinkExpansion interface{}
13 |
14 | type NetworkServiceExpansion interface{}
15 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/informers/externalversions/internalinterfaces/factory_interfaces.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by informer-gen. DO NOT EDIT.
5 |
6 | package internalinterfaces
7 |
8 | import (
9 | time "time"
10 |
11 | versioned "github.com/open-edge-platform/app-orch-deployment/app-interconnect/pkg/clientset/versioned"
12 | v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13 | runtime "k8s.io/apimachinery/pkg/runtime"
14 | cache "k8s.io/client-go/tools/cache"
15 | )
16 |
17 | // NewInformerFunc takes versioned.Interface and time.Duration to return a SharedIndexInformer.
18 | type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer
19 |
20 | // SharedInformerFactory a small interface to allow for adding an informer without an import cycle
21 | type SharedInformerFactory interface {
22 | Start(stopCh <-chan struct{})
23 | InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
24 | }
25 |
26 | // TweakListOptionsFunc is a function that transforms a v1.ListOptions.
27 | type TweakListOptionsFunc func(*v1.ListOptions)
28 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/listers/interconnect/v1alpha1/expansion_generated.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by lister-gen. DO NOT EDIT.
5 |
6 | package v1alpha1
7 |
8 | // ClusterListerExpansion allows custom methods to be added to
9 | // ClusterLister.
10 | type ClusterListerExpansion interface{}
11 |
12 | // LinkListerExpansion allows custom methods to be added to
13 | // LinkLister.
14 | type LinkListerExpansion interface{}
15 |
16 | // ServiceListerExpansion allows custom methods to be added to
17 | // ServiceLister.
18 | type ServiceListerExpansion interface{}
19 |
--------------------------------------------------------------------------------
/app-interconnect/pkg/listers/network/v1alpha1/expansion_generated.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 | // Code generated by lister-gen. DO NOT EDIT.
5 |
6 | package v1alpha1
7 |
8 | // NetworkListerExpansion allows custom methods to be added to
9 | // NetworkLister.
10 | type NetworkListerExpansion interface{}
11 |
12 | // NetworkClusterListerExpansion allows custom methods to be added to
13 | // NetworkClusterLister.
14 | type NetworkClusterListerExpansion interface{}
15 |
16 | // NetworkLinkListerExpansion allows custom methods to be added to
17 | // NetworkLinkLister.
18 | type NetworkLinkListerExpansion interface{}
19 |
20 | // NetworkServiceListerExpansion allows custom methods to be added to
21 | // NetworkServiceLister.
22 | type NetworkServiceListerExpansion interface{}
23 |
--------------------------------------------------------------------------------
/app-interconnect/requirements.txt:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # license checking
6 | python-debian==0.1.44
7 | reuse~=5.0.0
8 |
9 | # lint yaml
10 | yamllint~=1.27.1
11 |
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/cluster/cluster-001.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: Cluster
6 | metadata:
7 | name: cluster-001
8 | namespace: fleet-default
9 | labels:
10 | app.edge-orchestrator.intel.com/project-id: test-project
11 | spec:
12 | name: cluster-001
13 | displayName: "Cluster 001"
14 | kubeConfigSecretName: "cluster-001-kubeconfig"
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/cluster/cluster-002.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: Cluster
6 | metadata:
7 | name: cluster-002
8 | namespace: fleet-default
9 | labels:
10 | app.edge-orchestrator.intel.com/project-id: test-project
11 | spec:
12 | name: cluster-002
13 | displayName: "Cluster 002"
14 | kubeConfigSecretName: "cluster-002-kubeconfig"
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/cluster/cluster-003.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: Cluster
6 | metadata:
7 | name: cluster-003
8 | namespace: fleet-default
9 | labels:
10 | app.edge-orchestrator.intel.com/project-id: test-project
11 | spec:
12 | name: cluster-003
13 | displayName: "Cluster 003"
14 | kubeConfigSecretName: "cluster-003-kubeconfig"
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/cluster/cluster-004.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: Cluster
6 | metadata:
7 | name: cluster-004
8 | namespace: fleet-default
9 | labels:
10 | app.edge-orchestrator.intel.com/project-id: test-project
11 | spec:
12 | name: cluster-004
13 | displayName: "Cluster 004"
14 | kubeConfigSecretName: "cluster-004-kubeconfig"
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/cluster/cluster-005.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: Cluster
6 | metadata:
7 | name: cluster-005
8 | namespace: fleet-default
9 | labels:
10 | app.edge-orchestrator.intel.com/project-id: test-project
11 | spec:
12 | name: cluster-005
13 | displayName: "Cluster 005"
14 | kubeConfigSecretName: "cluster-005-kubeconfig"
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/deployment-cluster/test-deployment-cluster-1.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: DeploymentCluster
6 | metadata:
7 | name: test-deployment-cluster-1
8 | namespace: cluster-fleet-default-cluster-001
9 | labels:
10 | app.edge-orchestrator.intel.com/deployment-id: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
11 | app.edge-orchestrator.intel.com/deployment-namespace: fleet-default
12 | app.edge-orchestrator.intel.com/deployment-name: test-deployment
13 | app.edge-orchestrator.intel.com/network-name: test-network
14 | cluster.orchestration.io/cluster-id: cluster-001
15 | spec:
16 | deploymentId: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
17 | clusterId: cluster-001
18 | namespace: fleet-default
19 | status:
20 | apps:
21 | - name: test-app-1
22 | id: a-b321a235-48fb-5223-8fa2-d196caf5a420
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/deployment-cluster/test-deployment-cluster-2.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: DeploymentCluster
6 | metadata:
7 | name: test-deployment-cluster-2
8 | namespace: cluster-fleet-default-cluster-002
9 | labels:
10 | app.edge-orchestrator.intel.com/deployment-id: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
11 | app.edge-orchestrator.intel.com/deployment-namespace: fleet-default
12 | app.edge-orchestrator.intel.com/deployment-name: test-deployment
13 | app.edge-orchestrator.intel.com/network-name: test-network
14 | cluster.orchestration.io/cluster-id: cluster-002
15 | spec:
16 | deploymentId: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
17 | clusterId: cluster-002
18 | namespace: fleet-default
19 | status:
20 | apps:
21 | - name: test-app-2
22 | id: b-b321a235-48fb-5223-8fa2-d196caf5a420
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/deployment-cluster/test-deployment-cluster-3.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: DeploymentCluster
6 | metadata:
7 | name: test-deployment-cluster-3
8 | namespace: cluster-fleet-default-cluster-003
9 | labels:
10 | app.edge-orchestrator.intel.com/deployment-id: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
11 | app.edge-orchestrator.intel.com/deployment-namespace: fleet-default
12 | app.edge-orchestrator.intel.com/deployment-name: test-deployment
13 | app.edge-orchestrator.intel.com/network-name: test-network
14 | cluster.orchestration.io/cluster-id: cluster-003
15 | spec:
16 | deploymentId: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
17 | clusterId: cluster-003
18 | namespace: fleet-default
19 | status:
20 | apps:
21 | - name: test-app-1
22 | id: c-b321a235-48fb-5223-8fa2-d196caf5a420
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/deployment-cluster/test-deployment-cluster-4.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: DeploymentCluster
6 | metadata:
7 | name: test-deployment-cluster-4
8 | namespace: cluster-fleet-default-cluster-004
9 | labels:
10 | app.edge-orchestrator.intel.com/deployment-id: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
11 | app.edge-orchestrator.intel.com/deployment-namespace: fleet-default
12 | app.edge-orchestrator.intel.com/deployment-name: test-deployment
13 | app.edge-orchestrator.intel.com/network-name: test-network
14 | cluster.orchestration.io/cluster-id: cluster-002
15 | spec:
16 | deploymentId: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
17 | clusterId: cluster-004
18 | namespace: fleet-default
19 | status:
20 | apps:
21 | - name: test-app-2
22 | id: d-b321a235-48fb-5223-8fa2-d196caf5a420
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/deployment-cluster/test-deployment-cluster-5.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: DeploymentCluster
6 | metadata:
7 | name: test-deployment-cluster-5
8 | namespace: cluster-fleet-default-cluster-005
9 | labels:
10 | app.edge-orchestrator.intel.com/deployment-id: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
11 | app.edge-orchestrator.intel.com/deployment-namespace: fleet-default
12 | app.edge-orchestrator.intel.com/deployment-name: test-deployment
13 | app.edge-orchestrator.intel.com/network-name: test-network
14 | cluster.orchestration.io/cluster-id: cluster-002
15 | spec:
16 | deploymentId: 32e8a8e9-9f0a-4984-9ad7-98a39da9d246
17 | clusterId: cluster-005
18 | namespace: fleet-default
19 | status:
20 | apps:
21 | - name: test-app-1
22 | id: e-b321a235-48fb-5223-8fa2-d196caf5a420
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/deployment/test-deployment.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: app.edge-orchestrator.intel.com/v1beta1
5 | kind: Deployment
6 | metadata:
7 | name: test-deployment
8 | namespace: fleet-default
9 | labels:
10 | app.kubernetes.io/created-by: app-deployment-manager
11 | app.kubernetes.io/instance: deployment-g4smd
12 | app.kubernetes.io/managed-by: kustomize
13 | app.kubernetes.io/name: deployment
14 | app.kubernetes.io/part-of: app-deployment-manager
15 | spec:
16 | displayName: test-deployment
17 | project: test-project
18 | networkRef:
19 | name: test-network
20 | deploymentPackageRef:
21 | name: test-package
22 | version: 1.0.0
23 | applications: []
24 | deploymentType: targeted
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/cluster-fleet-default-cluster-001-namespace.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: cluster-fleet-default-cluster-001
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/cluster-fleet-default-cluster-002-namespace.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: cluster-fleet-default-cluster-002
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/cluster-fleet-default-cluster-003-namespace.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: cluster-fleet-default-cluster-003
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/cluster-fleet-default-cluster-004-namespace.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: cluster-fleet-default-cluster-004
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/cluster-fleet-default-cluster-005-namespace.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: cluster-fleet-default-cluster-005
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/fleet-default-namespace.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: fleet-default
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/interconnect-namespace.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: interconnect
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/test-namespace-1.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: test-namespace-1
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/namespace/test-namespace-2.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Namespace
6 | metadata:
7 | name: test-namespace-2
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/service/test-service-cluster-1.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Service
6 | metadata:
7 | name: test-service-1
8 | namespace: test-namespace-1
9 | annotations:
10 | meta.helm.sh/release-name: a-b321a235-48fb-5223-8fa2-d196caf5a420
11 | meta.helm.sh/release-namespace: east
12 | network.app.edge-orchestrator.intel.com/expose-service: "true"
13 | network.app.edge-orchestrator.intel.com/expose-port: "80"
14 | objectset.rio.cattle.io/id: default-a-b321a235-48fb-5223-8fa2-d196caf5a420
15 | labels:
16 | helm.sh/chart: skupper-hello-world-backend-0.1.0
17 | objectset.rio.cattle.io/hash: 728cfca556355f5052ebde2a165d7897bb8ee8e4
18 | spec:
19 | selector:
20 | app.edge-orchestrator.intel.com/name: test-app-1
21 | ports:
22 | - protocol: TCP
23 | port: 80
24 | targetPort: 80
--------------------------------------------------------------------------------
/app-interconnect/test/e2e/data/service/test-service-cluster-2.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: Service
6 | metadata:
7 | name: test-service-2
8 | namespace: test-namespace-2
9 | annotations:
10 | meta.helm.sh/release-name: b-b321a235-48fb-5223-8fa2-d196caf5a420
11 | meta.helm.sh/release-namespace: east
12 | network.app.edge-orchestrator.intel.com/expose-service: "true"
13 | network.app.edge-orchestrator.intel.com/expose-port: "80"
14 | objectset.rio.cattle.io/id: default-b-b321a235-48fb-5223-8fa2-d196caf5a420
15 | labels:
16 | helm.sh/chart: skupper-hello-world-backend-0.1.0
17 | objectset.rio.cattle.io/hash: 728cfca556355f5052ebde2a165d7897bb8ee8e4
18 | spec:
19 | selector:
20 | app.edge-orchestrator.intel.com/name: test-app-2
21 | ports:
22 | - protocol: TCP
23 | port: 80
24 | targetPort: 80
--------------------------------------------------------------------------------
/app-resource-manager/.chartver.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | devCharts:
5 | - deployments/app-resource-manager
6 |
--------------------------------------------------------------------------------
/app-resource-manager/.gitignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # jetbrains
6 | /vendor/
7 | /build/_output/*
8 | kind.config.yaml
9 | /cover.out
10 | /coverage.xml
11 | /coverage.html
12 | bin
13 | internal/northbound/testdata/*
14 | venv-env
15 | vendor
16 | *.log
17 | workspace
18 |
19 | *.lock
20 | *.tgz
21 |
22 | testdata
23 | node_modules
24 | package-lock.json
25 | package.json
26 |
--------------------------------------------------------------------------------
/app-resource-manager/.golangci.yml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | run:
6 | # Autogenerated files take too much time and memory to load,
7 | # even if we skip them with -skip-dirs or -skip-dirs;
8 | # or mark them as generated; or use nolint annotations.
9 | # So we define this tag and use it in the autogenerated files.
10 | build-tags:
11 | - codeanalysis
12 | # Do not run linters on unit-test files
13 | tests: false
14 |
15 | linters:
16 | enable:
17 | - gofmt
18 | - revive
19 | - misspell
20 | - typecheck
21 | - errcheck
22 | - dogsled
23 | - unconvert
24 | - nakedret
25 | - copyloopvar
26 | - gosec
27 |
28 | issues:
29 | exclude:
30 | - Error return value of `.*Close` is not checked
31 | - Error return value of `.*Flush` is not checked
32 |
--------------------------------------------------------------------------------
/app-resource-manager/.markdownlintignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | out/
5 | vendor/
6 | venv_app-resource-manager/
7 | node_modules/
8 |
--------------------------------------------------------------------------------
/app-resource-manager/.stylelintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "stylelint-config-standard",
3 | "rules": {
4 | "color-no-invalid-hex": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/app-resource-manager/REUSE.toml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | version = 1
4 |
5 | [[annotations]]
6 | path = ["venv_app-resource-manager/**", "out/*", "**go.sum", ".tool-versions", "**.json", "VERSION", "api/buf.lock",
7 | "pkg/api/**.pb**.go", "api/spec/**", "api/nbi/v2/pkg/restClient/**", "artifacts/**",
8 | "artifacts/**", "internal/**/mocks/**",
9 | "api/nbi/v2/spec/**", "api/nbi/v2/resource/v2/**",
10 | "vnc-proxy-web-ui/rfb.js","vnc-proxy-web-ui/keycloak.min.js", ".htmllintrc"]
11 | precedence = "aggregate"
12 | SPDX-FileCopyrightText = "2025 Intel Corporation"
13 | SPDX-License-Identifier = "Apache-2.0"
14 |
--------------------------------------------------------------------------------
/app-resource-manager/VERSION:
--------------------------------------------------------------------------------
1 | 2.4.4
2 |
--------------------------------------------------------------------------------
/app-resource-manager/api/nbi/v2/go.mod:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | //
3 | // SPDX-License-Identifier: Apache-2.0
4 |
5 | module github.com/open-edge-platform/app-orch-deployment/app-resource-manager/api/nbi/v2
6 |
7 | go 1.23.0
8 |
9 | toolchain go1.24.1
10 |
11 | require (
12 | github.com/envoyproxy/protoc-gen-validate v1.0.4
13 | github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0
14 | github.com/oapi-codegen/runtime v1.1.1
15 | google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d
16 | google.golang.org/grpc v1.64.1
17 | google.golang.org/protobuf v1.34.2
18 | )
19 |
20 | require (
21 | github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
22 | github.com/google/uuid v1.6.0 // indirect
23 | golang.org/x/net v0.38.0 // indirect
24 | golang.org/x/sys v0.31.0 // indirect
25 | golang.org/x/text v0.23.0 // indirect
26 | google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 // indirect
27 | )
28 |
--------------------------------------------------------------------------------
/app-resource-manager/api/spec/v2/openapi.yaml:
--------------------------------------------------------------------------------
1 | ../../nbi/v2/spec/v2/openapi.yaml
--------------------------------------------------------------------------------
/app-resource-manager/buf.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2025 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | version: v2
6 | modules:
7 | - path: api/nbi/v2
8 | deps:
9 | - buf.build/envoyproxy/protoc-gen-validate
10 | - buf.build/googleapis/googleapis
11 | lint:
12 | use:
13 | - STANDARD
14 | - ENUM_FIRST_VALUE_ZERO
15 | except:
16 | - FIELD_NOT_REQUIRED
17 | - PACKAGE_NO_IMPORT_CYCLE
18 | - ENUM_VALUE_PREFIX
19 | - ENUM_ZERO_VALUE_SUFFIX
20 | rpc_allow_google_protobuf_empty_responses: true
21 | disallow_comment_ignores: true
22 | breaking:
23 | use:
24 | - FILE
25 | except:
26 | - EXTENSION_NO_DELETE
27 | - FIELD_SAME_DEFAULT
28 |
--------------------------------------------------------------------------------
/app-resource-manager/cmd/app-resource-manager/main.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package main
5 |
6 | import (
7 | "flag"
8 | "github.com/open-edge-platform/app-orch-deployment/app-resource-manager/internal/manager"
9 | _ "github.com/open-edge-platform/orch-library/go/dazl/zap"
10 | )
11 |
12 | // The main entry point
13 | func main() {
14 | caPath := flag.String("caPath", "", "path to CA certificate")
15 | keyPath := flag.String("keyPath", "", "path to client private key")
16 | certPath := flag.String("certPath", "", "path to client certificate")
17 | configPath := flag.String("configPath", "/opt/app-resource-manager/config.yaml", "path to config file")
18 | flag.Parse()
19 |
20 | ready := make(chan bool)
21 | cfg := manager.Config{
22 | CAPath: *caPath,
23 | KeyPath: *keyPath,
24 | CertPath: *certPath,
25 | GRPCPort: 8080,
26 | WSPort: 5900,
27 | ConfigPath: *configPath,
28 | }
29 |
30 | mgr := manager.NewManager(cfg)
31 | mgr.Run()
32 | <-ready
33 | }
34 |
--------------------------------------------------------------------------------
/app-resource-manager/cmd/rest-proxy/rest-proxy.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package main
5 |
6 | import (
7 | "flag"
8 | "github.com/open-edge-platform/app-orch-deployment/app-resource-manager/internal/restproxy"
9 | "github.com/open-edge-platform/orch-library/go/dazl"
10 | _ "github.com/open-edge-platform/orch-library/go/dazl/zap"
11 | )
12 |
13 | var log = dazl.GetPackageLogger()
14 |
15 | func main() {
16 | allowedCorsOrigins := flag.String(
17 | "allowedCorsOrigins",
18 | "",
19 | "Comma separated list of allowed CORS origins",
20 | )
21 | basePath := flag.String(
22 | "basePath",
23 | "",
24 | "The rest server base Path",
25 | )
26 | restPort := flag.Int(
27 | "rest-port",
28 | 8081,
29 | "port that REST service runs on",
30 | )
31 | grpcEndpoint := flag.String(
32 | "grpc-endpoint",
33 | "localhost:8080",
34 | "The endpoint of the gRPC server",
35 | )
36 |
37 | flag.Parse()
38 | err := restproxy.Run(*restPort, *grpcEndpoint, *basePath, *allowedCorsOrigins, "/usr/local/etc/v2/openapi.yaml")
39 | if err != nil {
40 | log.Fatal(err)
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app-resource-manager/cmd/vnc-proxy/main.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package main
5 |
6 | import (
7 | "flag"
8 | "github.com/open-edge-platform/app-orch-deployment/app-resource-manager/internal/vncproxy"
9 | _ "github.com/open-edge-platform/orch-library/go/dazl/zap"
10 | )
11 |
12 | const webFileDir = "/usr/local/html/vnc-proxy-web-ui"
13 |
14 | func main() {
15 | configPath := flag.String("configPath", "/opt/vnc-proxy/config.yaml", "path to config file")
16 | flag.Parse()
17 |
18 | ready := make(chan bool)
19 | cfg := vncproxy.Config{
20 | WSPort: 5900,
21 | ConfigPath: *configPath,
22 | FileBase: webFileDir,
23 | }
24 |
25 | mgr := vncproxy.NewManager(cfg)
26 | mgr.Run()
27 | <-ready
28 | }
29 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/.helmignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | # Patterns to ignore when building packages.
5 | # This supports shell glob matching, relative path matching, and
6 | # negation (prefixed with !). Only one pattern per line.
7 | .DS_Store
8 | # Common VCS dirs
9 | .git/
10 | .gitignore
11 | .bzr/
12 | .bzrignore
13 | .hg/
14 | .hgignore
15 | .svn/
16 | # Common backup files
17 | *.swp
18 | *.bak
19 | *.tmp
20 | *.orig
21 | *~
22 | # Various IDEs
23 | .project
24 | .idea/
25 | *.tmproj
26 | .vscode/
27 |
28 | *.license
29 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/Chart.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | apiVersion: v2
4 | name: app-resource-manager
5 | description: A Helm chart for Kubernetes
6 | # A chart can be either an 'application' or a 'library' chart.
7 | #
8 | # Application charts are a collection of templates that can be packaged into versioned archives
9 | # to be deployed.
10 | #
11 | # Library charts provide useful utilities or functions for the chart developer. They're included as
12 | # a dependency of application charts to inject those utilities and functions into the rendering
13 | # pipeline. Library charts do not define any templates and therefore cannot be deployed.
14 | type: application
15 | # This is the chart version. This version number should be incremented each time you make changes
16 | # to the chart and its templates, including the app version.
17 | # Versions are expected to follow Semantic Versioning (https://semver.org/)
18 |
19 | version: 2.4.4
20 | # Default appVersion will be overwritten by the build to use {repo}/VERSION. This
21 | # value is supplied only to enable local unbuilt deployment of default released
22 | # content.
23 | appVersion: 2.4.4
24 | annotations:
25 | revision: "30701f0"
26 | created: "2025-05-06T21:49:13Z"
27 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/grafana/app-resource-manager-dashboard.json:
--------------------------------------------------------------------------------
1 | ../../../../grafana/app-resource-manager-dashboard.json
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/common.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | import future.keywords.in
7 |
8 | hasReadAccess if {
9 | projectRole := sprintf("%s_ao-rw", [input.metadata.activeprojectid[0]])
10 | some role in input.metadata["realm_access/roles"] # iteration
11 | [projectRole][_] == role
12 | }
13 |
14 | hasWriteAccess if {
15 | projectRole := sprintf("%s_ao-rw", [input.metadata.activeprojectid[0]])
16 | some role in input.metadata["realm_access/roles"] # iteration
17 | [projectRole][_] == role
18 | }
19 |
20 | hasVMConsoleAccess if {
21 | projectRole := sprintf("%s_ao-rw", [input.metadata.activeprojectid[0]])
22 | some role in input.metadata["realm_access/roles"] # iteration
23 | [projectRole][_] == role
24 | }
25 |
26 | hasReadAccess if {
27 | projectRole := "ao-m2m-rw"
28 | some role in input.metadata["realm_access/roles"] # iteration
29 | [projectRole][_] == role
30 | }
31 |
32 | hasWriteAccess if {
33 | projectRole := "ao-m2m-rw"
34 | some role in input.metadata["realm_access/roles"] # iteration
35 | [projectRole][_] == role
36 | }
37 |
38 | hasVMConsoleAccess if {
39 | projectRole := "ao-m2m-rw"
40 | some role in input.metadata["realm_access/roles"] # iteration
41 | [projectRole][_] == role
42 | }
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/delete_pod_endpoint.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | DeletePodRequest if {
7 | hasWriteAccess
8 | }
9 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/delete_pod_endpoint_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | test_delete_pod_write_role if {
7 | DeletePodRequest with input as {
8 | "request": {
9 | "app_id": "testapp",
10 | "cluster_id": "testcluester",
11 | "pod_name": "testpod",
12 | },
13 | "metadata": {
14 | "client": ["catalog-cli"],
15 | "realm_access/roles": [
16 | "default-roles-master",
17 | "offline_access",
18 | "ao-m2m-rw",
19 | "uma_authorization",
20 | ],
21 | },
22 | }
23 | }
24 |
25 | test_not_allow_delete_pod_read_role if {
26 | not DeletePodRequest with input as {
27 | "request": {
28 | "app_id": "testapp",
29 | "cluster_id": "testcluester",
30 | "pod_name": "testpod",
31 | },
32 | "metadata": {
33 | "client": ["catalog-cli"],
34 | "realm_access/roles": [
35 | "default-roles-master",
36 | "offline_access",
37 | "uma_authorization",
38 | ],
39 | },
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/get_vnc_endpoint.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | GetVNCRequest if {
7 | hasVMConsoleAccess
8 | }
9 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/list_app_workloads_endpoint.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | ListAppWorkloadsRequest if {
7 | hasReadAccess
8 | }
9 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/list_app_workloads_endpoint_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | test_allow_list_workloads_read_role if {
7 | ListAppWorkloadsRequest with input as {
8 | "request": {
9 | "app_id": "testapp",
10 | "cluster_id": "testcluester",
11 | },
12 | "metadata": {
13 | "client": ["catalog-cli"],
14 | "realm_access/roles": [
15 | "default-roles-master",
16 | "offline_access",
17 | "ao-m2m-rw",
18 | "uma_authorization",
19 | ],
20 | },
21 | }
22 | }
23 |
24 | test_not_allow_list_workloads_write_role if {
25 | not ListAppWorkloadsRequest with input as {
26 | "request": {
27 | "app_id": "testapp",
28 | "cluster_id": "testcluester",
29 | },
30 | "metadata": {
31 | "client": ["catalog-cli"],
32 | "realm_access/roles": [
33 | "default-roles-master",
34 | "offline_access",
35 | "uma_authorization",
36 | ],
37 | },
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/list_endpoints.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | ListAppEndpointsRequest if {
7 | hasReadAccess
8 | }
9 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/list_endpoints_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | test_allow_list_endpoints_read_role if {
7 | ListAppEndpointsRequest with input as {
8 | "request": {
9 | "app_id": "testapp",
10 | "cluster_id": "testcluester",
11 | },
12 | "metadata": {
13 | "client": ["catalog-cli"],
14 | "realm_access/roles": [
15 | "default-roles-master",
16 | "offline_access",
17 | "ao-m2m-rw",
18 | "uma_authorization",
19 | ],
20 | },
21 | }
22 | }
23 |
24 | test_not_allow_list_endpoints_write_role if {
25 | not ListAppEndpointsRequest with input as {
26 | "request": {
27 | "app_id": "testapp",
28 | "cluster_id": "testcluester",
29 | },
30 | "metadata": {
31 | "client": ["catalog-cli"],
32 | "realm_access/roles": [
33 | "default-roles-master",
34 | "offline_access",
35 | "uma_authorization",
36 | ],
37 | },
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/restart_vm_endpoint.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | RestartVirtualMachineRequest if {
7 | hasWriteAccess
8 | }
9 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/restart_vm_endpoint_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | test_not_allow_restart_vm_read_role if {
7 | not RestartVirtualMachineRequest with input as {
8 | "request": {
9 | "app_id": "testapp",
10 | "cluster_id": "testcluester",
11 | "virtual_machine_id": "5d0cef5c-9981-4987-a67e-3e207783218b",
12 | },
13 | "metadata": {
14 | "client": ["catalog-cli"],
15 | "realm_access/roles": [
16 | "default-roles-master",
17 | "offline_access",
18 | "uma_authorization",
19 | ],
20 | },
21 | }
22 | }
23 |
24 | test_restart_vm_read_write_role if {
25 | RestartVirtualMachineRequest with input as {
26 | "request": {
27 | "app_id": "testapp",
28 | "cluster_id": "testcluester",
29 | "virtual_machine_id": "5d0cef5c-9981-4987-a67e-3e207783218b",
30 | },
31 | "metadata": {
32 | "client": ["catalog-cli"],
33 | "realm_access/roles": [
34 | "default-roles-master",
35 | "offline_access",
36 | "ao-m2m-rw",
37 | "uma_authorization",
38 | ],
39 | },
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/start_vm_endpoint.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | StartVirtualMachineRequest if {
7 | hasWriteAccess
8 | }
9 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/start_vm_endpoint_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | test_not_allow_start_vm_read_role if {
7 | not StartVirtualMachineRequest with input as {
8 | "request": {
9 | "app_id": "testapp",
10 | "cluster_id": "testcluester",
11 | "virtual_machine_id": "5d0cef5c-9981-4987-a67e-3e207783218b",
12 | },
13 | "metadata": {
14 | "client": ["catalog-cli"],
15 | "realm_access/roles": [
16 | "default-roles-master",
17 | "offline_access",
18 | "uma_authorization",
19 | ],
20 | },
21 | }
22 | }
23 |
24 | test_start_vm_write_role if {
25 | StartVirtualMachineRequest with input as {
26 | "request": {
27 | "app_id": "testapp",
28 | "cluster_id": "testcluester",
29 | "virtual_machine_id": "5d0cef5c-9981-4987-a67e-3e207783218b",
30 | },
31 | "metadata": {
32 | "client": ["catalog-cli"],
33 | "realm_access/roles": [
34 | "default-roles-master",
35 | "offline_access",
36 | "ao-m2m-rw",
37 | "uma_authorization",
38 | ],
39 | },
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/stop_vm_endpoint.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | StopVirtualMachineRequest if {
7 | hasWriteAccess
8 | }
9 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/files/openpolicyagent/v2/stop_vm_endpoint_test.rego:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | package resourcev2
5 |
6 | test_not_allow_stop_vm_read_role if {
7 | not StopVirtualMachineRequest with input as {
8 | "request": {
9 | "app_id": "testapp",
10 | "cluster_id": "testcluester",
11 | "virtual_machine_id": "5d0cef5c-9981-4987-a67e-3e207783218b",
12 | },
13 | "metadata": {
14 | "client": ["catalog-cli"],
15 | "realm_access/roles": [
16 | "default-roles-master",
17 | "offline_access",
18 | "uma_authorization",
19 | ],
20 | },
21 | }
22 | }
23 |
24 | test_stop_vm_write_role if {
25 | StopVirtualMachineRequest with input as {
26 | "request": {
27 | "app_id": "testapp",
28 | "cluster_id": "testcluester",
29 | "virtual_machine_id": "5d0cef5c-9981-4987-a67e-3e207783218b",
30 | },
31 | "metadata": {
32 | "client": ["catalog-cli"],
33 | "realm_access/roles": [
34 | "default-roles-master",
35 | "offline_access",
36 | "ao-m2m-rw",
37 | "uma_authorization",
38 | ],
39 | },
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/templates/NOTES.txt:
--------------------------------------------------------------------------------
1 | App Resource Manager Service
2 | ---
3 |
4 | App Resource Manager microservice enables users to control and access
5 | different kind of resources including VMs, containers, etc using API.
6 |
7 | ---
8 | revision: {{ .Chart.Annotations.revision }}
9 | created: {{ .Chart.Annotations.created }}
10 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/templates/NOTES.txt.license:
--------------------------------------------------------------------------------
1 | SPDX-License-Identifier: Apache-2.0
2 | Copyright (C) 2023 Intel Corporation
3 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/templates/configmap.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 | ---
4 | apiVersion: v1
5 | kind: ConfigMap
6 | metadata:
7 | name: {{ include "app-resource-manager.fullname" . }}
8 | labels:
9 | {{- include "app-resource-manager.labels" . | nindent 4 }}
10 | data:
11 | config.yaml: |-
12 | {{ toYaml .Values.config | indent 4}}
13 | logging.yaml: |-
14 | {{ toYaml .Values.logging | indent 4 }}
15 |
16 | ---
17 |
18 | {{ if .Values.openpolicyagent.enabled }}
19 | apiVersion: v1
20 | kind: ConfigMap
21 | metadata:
22 | name: {{ template "app-resource-manager.fullname" . }}-opa-rego-v2
23 | labels:
24 | chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
25 | release: "{{ .Release.Name }}"
26 | heritage: "{{ .Release.Service }}"
27 | data:
28 | {{ (.Files.Glob "files/openpolicyagent/v2/*.rego").AsConfig | indent 2 }}
29 | {{- end}}
30 |
31 | ---
32 | apiVersion: v1
33 | kind: ConfigMap
34 | metadata:
35 | name: {{ include "app-resource-manager.fullname" . }}-dashboard
36 | labels:
37 | grafana_admin_dashboard: "1"
38 | {{- include "app-resource-manager.labels" . | nindent 4 }}
39 | annotations:
40 | grafana_folder: "Orchestrator"
41 | data:
42 | {{ (.Files.Glob "files/grafana/*.json").AsConfig | indent 2 }}
43 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/templates/serviceaccount.yaml:
--------------------------------------------------------------------------------
1 | # yamllint disable-file
2 | # SPDX-FileCopyrightText: (C) 2024 Intel Corporation
3 | #
4 | # SPDX-License-Identifier: Apache-2.0
5 | ---
6 | {{- if .Values.serviceAccount.create }}
7 | apiVersion: v1
8 | kind: ServiceAccount
9 | metadata:
10 | name: {{ template "app-resource-manager.serviceAccountName" . }}
11 | labels:
12 | {{- include "app-resource-manager.labels" . | nindent 4 }}
13 | {{- end }}
14 |
--------------------------------------------------------------------------------
/app-resource-manager/deployments/app-resource-manager/templates/tests/test-connection.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | apiVersion: v1
5 | kind: Pod
6 | metadata:
7 | name: "{{ include "app-resource-manager.fullname" . }}-test-connection"
8 | labels:
9 | {{- include "app-resource-manager.labels" . | nindent 4 }}
10 | annotations:
11 | "helm.sh/hook": test
12 | spec:
13 | containers:
14 | - name: wget
15 | image: busybox:1.36.0
16 | command: ['wget']
17 | args: ['{{ include "app-resource-manager.fullname" . }}:{{ .Values.service.port }}']
18 | restartPolicy: Never
19 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/kubevirt/vnc_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package kubevirt
5 |
6 | import (
7 | "github.com/stretchr/testify/assert"
8 | "testing"
9 | )
10 |
11 | const (
12 | testVNCPath = "/vnc/projectID1/appID1/cluster1/vm1"
13 | )
14 |
15 | func TestNewVNCPath(t *testing.T) {
16 | p, err := newVNCPath(testVNCPath)
17 | assert.NoError(t, err)
18 | assert.NotNil(t, p)
19 | }
20 |
21 | func TestNewVNCPath_WrongPath(t *testing.T) {
22 | p, err := newVNCPath("")
23 | assert.Error(t, err)
24 | assert.Nil(t, p)
25 | }
26 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/model/sb_vm_state.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package model
5 |
6 | // VMState defines the VM state
7 | type VMState int
8 |
9 | const (
10 | // VMStateUnknown indicates the VM state unknown
11 | VMStateUnknown VMState = iota
12 | // VMStateStart indicates the VM state start
13 | VMStateStart
14 | // VMStateStop indicates the VM state stop
15 | VMStateStop
16 | // VMStateRestart indicates the VM state restart
17 | VMStateRestart
18 | )
19 |
20 | // String returns the VM state in string format
21 | func (v VMState) String() string {
22 | return [...]string{"Unknown", "Start", "Stop", "Restart"}[v]
23 | }
24 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/model/sb_vm_state_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package model
5 |
6 | import (
7 | "github.com/stretchr/testify/assert"
8 | "testing"
9 | )
10 |
11 | func TestVMState_String(t *testing.T) {
12 | stateUnknown := VMStateUnknown
13 | assert.Equal(t, "Unknown", stateUnknown.String())
14 | stateStart := VMStateStart
15 | assert.Equal(t, "Start", stateStart.String())
16 | stateStop := VMStateStop
17 | assert.Equal(t, "Stop", stateStop.String())
18 | stateRestart := VMStateRestart
19 | assert.Equal(t, "Restart", stateRestart.String())
20 | }
21 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/northbound/services/v2/resource/utils.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package resource
5 |
6 | import (
7 | "context"
8 | "github.com/open-edge-platform/orch-library/go/dazl"
9 | "google.golang.org/grpc/metadata"
10 | "strings"
11 | )
12 |
13 | func logActivity(ctx context.Context, verb string, thing string, args ...string) {
14 | md, ok := metadata.FromIncomingContext(ctx)
15 | if ok && len(md.Get("name")) > 0 {
16 | log.Infow("User", dazl.Strings("name", md.Get("name")),
17 | dazl.String("verb", verb),
18 | dazl.String("thing", thing),
19 | dazl.String("args", strings.Join(args, "/")))
20 | } else {
21 | log.Infow("User", dazl.Strings("client", md.Get("client")),
22 | dazl.String("verb", verb),
23 | dazl.String("thing", thing),
24 | dazl.String("args", strings.Join(args, "/")))
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/utils/env/utils.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package env
5 |
6 | import (
7 | "os"
8 | "strconv"
9 | )
10 |
11 | const (
12 | msgSizeLimit = "MSG_SIZE_LIMIT"
13 | )
14 |
15 | // GetMessageSizeLimit gets message size limit
16 | func GetMessageSizeLimit() (int64, error) {
17 | msgSizeLimitStr := os.Getenv(msgSizeLimit)
18 | msgSizeLimit, err := strconv.ParseInt(msgSizeLimitStr, 10, 64)
19 | if err != nil {
20 | return 0, err
21 | }
22 | msgSizeLimitBytes := msgSizeLimit * 1024 * 1024
23 | return msgSizeLimitBytes, nil
24 | }
25 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/utils/env/utils_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package env
5 |
6 | import (
7 | "github.com/stretchr/testify/assert"
8 | "os"
9 | "testing"
10 | )
11 |
12 | func TestGetMessageSizeLimit(t *testing.T) {
13 | tests := []struct {
14 | name string
15 | envVar string
16 | expectedSize int64
17 | expectingErr bool
18 | }{
19 | {
20 | name: "normal case",
21 | envVar: "2",
22 | expectedSize: 2097152,
23 | expectingErr: false,
24 | },
25 | {
26 | name: "no env var",
27 | envVar: "",
28 | expectedSize: 0,
29 | expectingErr: true,
30 | },
31 | }
32 |
33 | for _, tt := range tests {
34 | t.Run(tt.name, func(t *testing.T) {
35 | err := os.Setenv(msgSizeLimit, tt.envVar)
36 | assert.NoError(t, err)
37 |
38 | size, err := GetMessageSizeLimit()
39 |
40 | if tt.expectingErr {
41 | assert.Error(t, err)
42 | } else {
43 | assert.NoError(t, err)
44 | assert.Equal(t, tt.expectedSize, size)
45 | }
46 |
47 | err = os.Unsetenv(msgSizeLimit)
48 | assert.NoError(t, err)
49 | })
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/utils/ratelimiter/util.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package ratelimiter
5 |
6 | import (
7 | "os"
8 | "strconv"
9 | )
10 |
11 | const (
12 | rateLimiterQPS = "RATE_LIMITER_QPS"
13 | rateLimiterBurst = "RATE_LIMITER_BURST"
14 | )
15 |
16 | func GetRateLimiterParams() (float64, int64, error) {
17 | qps := os.Getenv(rateLimiterQPS)
18 | qpsValue, err := strconv.ParseFloat(qps, 32)
19 | if err != nil {
20 | return 0, 0, err
21 | }
22 | burst := os.Getenv(rateLimiterBurst)
23 | burstValue, err := strconv.ParseInt(burst, 10, 32)
24 | if err != nil {
25 | return 0, 0, err
26 | }
27 | return qpsValue, burstValue, nil
28 | }
29 |
--------------------------------------------------------------------------------
/app-resource-manager/internal/utils/ratelimiter/util_test.go:
--------------------------------------------------------------------------------
1 | // SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | // SPDX-License-Identifier: Apache-2.0
3 |
4 | package ratelimiter
5 |
6 | import (
7 | "github.com/stretchr/testify/assert"
8 | "os"
9 | "testing"
10 | )
11 |
12 | func TestGetRateLimiterParams(t *testing.T) {
13 | err := os.Setenv(rateLimiterQPS, "20")
14 | assert.NoError(t, err)
15 | err = os.Setenv(rateLimiterBurst, "300")
16 | assert.NoError(t, err)
17 | qps, burst, err := GetRateLimiterParams()
18 | assert.NoError(t, err)
19 |
20 | assert.Equal(t, float64(20), qps)
21 | assert.Equal(t, float64(300), float64(burst))
22 |
23 | }
24 |
25 | func TestGetRateLimiterParamsQpsError(t *testing.T) {
26 | err := os.Setenv(rateLimiterQPS, "test-error")
27 | assert.NoError(t, err)
28 |
29 | qps, burst, err := GetRateLimiterParams()
30 | assert.Error(t, err)
31 | assert.Equal(t, 0, int(qps))
32 | assert.Equal(t, 0, int(burst))
33 |
34 | }
35 |
36 | func TestGetRateLimiterParamsBurstParamError(t *testing.T) {
37 | err := os.Setenv(rateLimiterQPS, "20")
38 | assert.NoError(t, err)
39 | err = os.Setenv(rateLimiterBurst, "test-error")
40 | assert.NoError(t, err)
41 | qps, burst, err := GetRateLimiterParams()
42 | assert.Error(t, err)
43 | assert.Equal(t, 0, int(qps))
44 | assert.Equal(t, 0, int(burst))
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/app-resource-manager/requirements.txt:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2023 Intel Corporation
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 |
5 | # license checking
6 | python-debian==0.1.44
7 | reuse~=5.0.0
8 |
9 | # lint yaml
10 | yamllint~=1.35.1
--------------------------------------------------------------------------------
/app-resource-manager/test/configs/arm_config.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | webSocketServer:
5 | protocol: "wss"
6 | hostName: "vnc.kind.internal"
7 | sessionLimitPerIP: 0
8 | sessionLimitPerAccount: 0
9 | readLimitByte: 0
10 | dlIdleTimeoutMin: 0
11 | ulIdleTimeoutMin: 0
12 | allowedOrigins:
13 | - https://vnc.kind.internal
14 |
--------------------------------------------------------------------------------
/app-resource-manager/test/configs/invalid_config.yaml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: (C) 2022 Intel Corporation
2 | # SPDX-License-Identifier: Apache-2.0
3 |
4 | edgeClusterManager:
5 | # missing endpoint is an invalid config
6 | # endpoint: "http://localhost:8080" # for test
7 |
--------------------------------------------------------------------------------
/app-resource-manager/vnc-proxy-web-ui/vnc-proxy-index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |