# Parallel with mutually exclusive cases

In this example, we are going to see how we can create a Parallel with mutually
exclusive branches.

This example is the same as the
[multiple branches example](../multiple-branches/README.md) except that we are
now going to rely on the Knative
[switch](https://github.com/lionelvillard/knative-functions#switch) function to
provide a soft mutual exclusivity guarantee .

NOTE: this example must be deployed in the default namespace.

## Prerequisites

Please refer to the sample overview for the [prerequisites](../README.md).

### Create the Knative Services

Let's first create the switcher and transformer services that we will use in our
Parallel.

```yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: me-even-odd-switcher
spec:
  template:
    spec:
      containers:
      - image: villardl/switcher-nodejs:0.1
        env:
        - name: EXPRESSION
          value: Math.round(Date.parse(event.time) / 60000) % 2
        - name: CASES
          value: '[0, 1]'
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: even-transformer
spec:
  template:
    spec:
      containers:
      - image: villardl/transformer-nodejs:0.1
        env:
        - name: TRANSFORMER
          value: |
            ({"message": "we are even!"})

---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: odd-transformer
spec:
  template:
    spec:
      containers:
      - image: villardl/transformer-nodejs:0.1
        env:
        - name: TRANSFORMER
          value: |
            ({"message": "this is odd!"})
.
```

```bash
kubectl create -f ./switcher.yaml -f ./transformers.yaml
```

### Create the Service displaying the events created by Parallel

```yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: event-display
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
```

```bash
kubectl -n default create -f ./event-display.yaml
```

### Create the Parallel object

The `parallel.yaml` file contains the specifications for creating the Parallel
object.

```yaml
apiVersion: flows.knative.dev/v1
kind: Parallel
metadata:
  name: me-odd-even-parallel
spec:
  channelTemplate:
    apiVersion: messaging.knative.dev/v1
    kind: InMemoryChannel
  branches:
    - filter:
        uri: "http://me-even-odd-switcher.default.svc.cluster.local/0"
      subscriber:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: me-even-transformer
    - filter:
        uri: "http://me-even-odd-switcher.default.svc.cluster.local/1"
      subscriber:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: me-odd-transformer
  reply:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: me-event-display
```

```bash
kubectl create -f ./parallel.yaml
```

### Create the PingSource targeting the Parallel object

This will create a PingSource which will send a CloudEvent with
`{"message": "Even or odd?"}` as the data payload every minute.

```yaml
apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: me-ping-source
spec:
  schedule: "*/1 * * * *"
  contentType: "application/json"
  data: '{"message": "Even or odd?"}'
  sink:
    ref:
      apiVersion: flows.knative.dev/v1
      kind: Parallel
      name: me-odd-even-parallel
```

```bash
kubectl create -f ./ping-source.yaml
```

### Inspecting the results

You can now see the final output by inspecting the logs of the
`me-event-display` pods. Note that since we set the `PingSource` to emit every
minute, it might take some time for the events to show up in the logs.

Let's look at the `me-event-display` log:

```bash
kubectl logs -l serving.knative.dev/service=me-event-display --tail=50 -c user-container

☁️  cloudevents.Event
Validation: valid
Context Attributes,
  specversion: 1.0
  type: dev.knative.sources.ping
  source: /apis/v1/namespaces/default/pingsources/me-ping-source
  id: 0b0db15c-9b36-4388-8eaa-8c23a9dc2707
  time: 2020-03-03T21:30:00.0007292Z
  datacontenttype: application/json; charset=utf-8
Extensions,
  knativehistory: me-odd-even-parallel-kn-parallel-kn-channel.default.svc.cluster.local; me-odd-even-parallel-kn-parallel-0-kn-channel.default.svc.cluster.local
  traceparent: 00-e8b17109cd21d4fa66a86633b5a614c7-ba96d220fe13211c-00
Data,
  {
    "message": "we are even!"
  }
☁️  cloudevents.Event
Validation: valid
Context Attributes,
  specversion: 1.0
  type: dev.knative.sources.ping
  source: /apis/v1/namespaces/default/pingsources/me-ping-source
  id: 321170d1-dea7-4b18-9290-28adb1de089b
  time: 2020-03-03T21:31:00.0007847Z
  datacontenttype: application/json; charset=utf-8
Extensions,
  knativehistory: me-odd-even-parallel-kn-parallel-kn-channel.default.svc.cluster.local; me-odd-even-parallel-kn-parallel-1-kn-channel.default.svc.cluster.local
  traceparent: 00-78d8b044d23c85789f0a13fd3679ac24-1d69ddde56d620c7-00
Data,
  {
    "message": "this is odd!"
  }
```
