[[kubernetes-service-accounts-component]]
= Kubernetes Service Account Component
:page-source: components/camel-kubernetes/src/main/docs/kubernetes-service-accounts-component.adoc

*Available as of Camel version 2.17*

The Kubernetes Service Account component is one of xref:kubernetes.adoc[Kubernetes Components] which
provides a producer to execute kubernetes Service Account operations.


== Component Options

// component options: START
The Kubernetes Service Account component supports 1 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
|===
// component options: END


== Endpoint Options
// endpoint options: START
The Kubernetes Service Account endpoint is configured using URI syntax:

----
kubernetes-service-accounts:masterUrl
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *masterUrl* | *Required* Kubernetes Master url |  | String
|===


=== Query Parameters (22 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *apiVersion* (producer) | The Kubernetes API Version to use |  | String
| *dnsDomain* (producer) | The dns domain, used for ServiceCall EIP |  | String
| *kubernetesClient* (producer) | Default KubernetesClient to use if provided |  | KubernetesClient
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *operation* (producer) | Producer operation to do on Kubernetes |  | String
| *portName* (producer) | The port name, used for ServiceCall EIP |  | String
| *portProtocol* (producer) | The port protocol, used for ServiceCall EIP | tcp | String
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *connectionTimeout* (advanced) | Connection timeout in milliseconds to use when making requests to the Kubernetes API server. |  | Integer
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *caCertData* (security) | The CA Cert Data |  | String
| *caCertFile* (security) | The CA Cert File |  | String
| *clientCertData* (security) | The Client Cert Data |  | String
| *clientCertFile* (security) | The Client Cert File |  | String
| *clientKeyAlgo* (security) | The Key Algorithm used by the client |  | String
| *clientKeyData* (security) | The Client Key data |  | String
| *clientKeyFile* (security) | The Client Key file |  | String
| *clientKeyPassphrase* (security) | The Client Key Passphrase |  | String
| *oauthToken* (security) | The Auth Token |  | String
| *password* (security) | Password to connect to Kubernetes |  | String
| *trustCerts* (security) | Define if the certs we used are trusted anyway or not |  | Boolean
| *username* (security) | Username to connect to Kubernetes |  | String
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-kubernetes-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 2 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.kubernetes-service-accounts.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.kubernetes-service-accounts.enabled* | Whether to enable auto configuration of the kubernetes-service-accounts component. This is enabled by default. |  | Boolean
|===
// spring-boot-auto-configure options: END

== Supported producer operation

- listServiceAccounts
- listServiceAccountsByLabels
- getServiceAccount
- createServiceAccount
- deleteServiceAccount

== Kubernetes ServiceAccounts Produce Examples

- listServiceAccounts: this operation list the sa on a kubernetes cluster

[source,java]
--------------------------------------------------------------------------------
from("direct:list").
    toF("kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=listServiceAccounts").
    to("mock:result");
--------------------------------------------------------------------------------

This operation return a List of servoces from your cluster

- listServiceAccountsByLabels:  this operation list the sa by labels on a kubernetes cluster

[source,java]
--------------------------------------------------------------------------------
from("direct:listByLabels").process(new Processor() {

            @Override
            public void process(Exchange exchange) throws Exception {
                Map<String, String> labels = new HashMap<>();
                labels.put("key1", "value1");
                labels.put("key2", "value2");
                exchange.getIn().setHeader(KubernetesConstants.KUBERNETES_SERVICE_ACCOUNTS_LABELS, labels);
            }
        });
    toF("kubernetes-service-accounts:///?kubernetesClient=#kubernetesClient&operation=listServiceAccountsByLabels").
    to("mock:result");
--------------------------------------------------------------------------------

This operation return a List of Services from your cluster, using a label selector (with key1 and key2, with value value1 and value2)
