---
# do any asserts here
- name: Create temp directory for doing work in
  command: mktemp -d /tmp/openshift-service-catalog-ansible-XXXXXX
  register: mktemp
  changed_when: False

- name: Set default image variables based on openshift_deployment_type
  include_vars: "{{ item }}"
  with_first_found:
  - "{{ openshift_deployment_type }}.yml"
  - "default_images.yml"

- name: Set service_catalog image facts
  set_fact:
    openshift_service_catalog_image_prefix: "{{ openshift_service_catalog_image_prefix | default(__openshift_service_catalog_image_prefix) }}"
    openshift_service_catalog_image_version: "{{ openshift_service_catalog_image_version | default(__openshift_service_catalog_image_version) }}"

- name: Set Service Catalog namespace
  oc_project:
    state: present
    name: "kube-service-catalog"
    node_selector: ""

- when: os_sdn_network_plugin_name == 'redhat/openshift-ovs-multitenant'
  block:
  - name: Waiting for netnamespace kube-service-catalog to be ready
    oc_obj:
      kind: netnamespace
      name: kube-service-catalog
      state: list
    register: get_output
    until: not get_output.results.stderr is defined
    retries: 30
    delay: 1
    changed_when: false

  - name: Make kube-service-catalog project network global
    command: >
      {{ openshift_client_binary }} --config=/etc/origin/master/admin.kubeconfig adm pod-network make-projects-global kube-service-catalog

- include_tasks: generate_certs.yml

- copy:
    src: kubeservicecatalog_roles_bindings.yml
    dest: "{{ mktemp.stdout }}/kubeservicecatalog_roles_bindings.yml"

- oc_obj:
    name: service-catalog-role-bindings
    kind: template
    namespace: "kube-service-catalog"
    files:
    - "{{ mktemp.stdout }}/kubeservicecatalog_roles_bindings.yml"

- oc_process:
    create: True
    template_name: service-catalog-role-bindings
    namespace: "kube-service-catalog"

- copy:
    src: kubesystem_roles_bindings.yml
    dest: "{{ mktemp.stdout }}/kubesystem_roles_bindings.yml"

- oc_obj:
    name: kube-system-service-catalog-role-bindings
    kind: template
    namespace: kube-system
    files:
    - "{{ mktemp.stdout }}/kubesystem_roles_bindings.yml"

- oc_process:
    create: True
    template_name: kube-system-service-catalog-role-bindings
    namespace: kube-system

- copy:
    src: openshift_catalog_clusterroles.yml
    dest: "{{ mktemp.stdout }}/openshift_catalog_clusterroles.yml"

- name: Apply Service Catalog cluster roles
  retries: 5
  delay: 2
  register: task_result
  until: task_result.rc == 0
  shell: >
    {{ openshift_client_binary }} auth reconcile --config={{ openshift.common.config_base }}/master/admin.kubeconfig -f {{ mktemp.stdout}}/openshift_catalog_clusterroles.yml

- oc_adm_policy_user:
    namespace: kube-service-catalog
    resource_kind: scc
    resource_name: hostmount-anyuid
    state: present
    user: "system:serviceaccount:kube-service-catalog:service-catalog-apiserver"

- name: Set SA cluster-role
  oc_adm_policy_user:
    state: present
    namespace: "kube-service-catalog"
    resource_kind: cluster-role
    resource_name: admin
    user: "system:serviceaccount:kube-service-catalog:default"

- name: Checking for master.etcd-ca.crt
  stat:
    path: /etc/origin/master/master.etcd-ca.crt
    get_checksum: false
    get_attributes: false
    get_mime: false
  register: etcd_ca_crt
  check_mode: no

## api server
- template:
    src: api_server.j2
    dest: "{{ mktemp.stdout }}/service_catalog_api_server.yml"
  vars:
    image: ""
    namespace: ""
    cpu_limit: none
    memory_limit: none
    cpu_requests: none
    memory_request: none
    cors_allowed_origin: localhost
    etcd_servers: "{{ openshift_master_etcd_urls | join(',') }}"
    etcd_cafile: "{{ '/etc/origin/master/master.etcd-ca.crt' if etcd_ca_crt.stat.exists else '/etc/origin/master/ca-bundle.crt' }}"
    node_selector: "{{ openshift_service_catalog_nodeselector | default ({'openshift-infra': 'apiserver'}) }}"
    # apiserver_ca is defined in generate_certs.yml
    ca_hash: "{{ apiserver_ca.content|hash('sha1') }}"

- name: Set Service Catalog API Server daemonset
  oc_obj:
    state: present
    namespace: "kube-service-catalog"
    kind: daemonset
    name: apiserver
    files:
    - "{{ mktemp.stdout }}/service_catalog_api_server.yml"
    delete_after: yes

- name: Set Service Catalog API Server service
  oc_service:
    name: apiserver
    namespace: kube-service-catalog
    state: present
    ports:
    - name: secure
      port: 443
      protocol: TCP
      targetPort: 6443
    selector:
      app: apiserver
    session_affinity: None

- template:
    src: api_server_route.j2
    dest: "{{ mktemp.stdout }}/service_catalog_api_route.yml"

- name: Set Service Catalog API Server route
  oc_obj:
    state: present
    namespace: "kube-service-catalog"
    kind: route
    name: apiserver
    files:
    - "{{ mktemp.stdout }}/service_catalog_api_route.yml"
    delete_after: yes

## controller manager
- template:
    src: controller_manager.j2
    dest: "{{ mktemp.stdout }}/controller_manager.yml"
  vars:
    image: ""
    cpu_limit: none
    memory_limit: none
    node_selector: "{{ openshift_service_catalog_nodeselector | default ({'openshift-infra': 'apiserver'}) }}"

- name: Set Controller Manager deployment
  oc_obj:
    state: present
    namespace: "kube-service-catalog"
    kind: daemonset
    name: controller-manager
    files:
    - "{{ mktemp.stdout }}/controller_manager.yml"
    delete_after: yes

- include_tasks: start_api_server.yml

- name: Delete temp directory
  file:
    name: "{{ mktemp.stdout }}"
    state: absent
  changed_when: False
