Jump to: navigation, search
(Update with the copy of version: 9.0.0DRAFT)
(Update with the copy of version: 9.0.0DRAFT)
Line 1: Line 1:
= Deployment of Web Services and Applications version 9.0.002.57 in Kubernetes =
+
=Deployment of Web Services and Applications in Kubernetes=
 +
{{NoteFormat|
 +
* Only a Helm v3 deployment method is supported.
 +
* High Availability (HA) is provided through N+1 architecture.
 +
* Disaster Recovery (DR) – Contact your Genesys representative and the Architecture team for guidance about recommended DR designs.
 +
|3}}
 
<!-- {{PrereleaseDisclaimer}} -->
 
<!-- {{PrereleaseDisclaimer}} -->
 
==Prerequisites==
 
==Prerequisites==
For hardware, software, Workspace Web Edition, and Gplus Adapter for Salesforce Requirements requirements, refer to [[Prerequisites|Prerequisites]].
+
For hardware, software, Workspace Web Edition, and Gplus Adapter for Salesforce requirements, refer to [[Prerequisites|Prerequisites]].
 
Also, ensure your environment has access to [http://docker.io/library docker.io/library].
 
Also, ensure your environment has access to [http://docker.io/library docker.io/library].
 
If internet access is not available, manually load the following public container images to the Docker registry:
 
If internet access is not available, manually load the following public container images to the Docker registry:
* {{#Widget:ExtLink|link=https://hub.docker.com/_/consul|displaytext=consul:0.9.1}}
+
* {{#Widget:ExtLink|link=https://hub.docker.com/_/consul|displaytext=Consul 1.7.2}}
* {{#Widget:ExtLink|link=https://hub.docker.com/_/elasticsearch|displaytext=elasticsearch:6.8.6}}
+
* {{#Widget:ExtLink|link=https://hub.docker.com/_/elasticsearch|displaytext=Elasticsearch 6.x}}
* {{#Widget:ExtLink|link=https://hub.docker.com/_/postgres|displaytext=postgres:11-alpine}}
+
* {{#Widget:ExtLink|link=https://hub.docker.com/_/postgres|displaytext=Postgres 11}}
* {{#Widget:ExtLink|link=https://hub.docker.com/_/redis|displaytext=redis:5-stretch}}  
+
* {{#Widget:ExtLink|link=https://hub.docker.com/_/redis|displaytext=Redis 5}}  
<!--
 
===Hardware Requirements===
 
* '''Nodes:''' 3 nodes (Virtual Machines)
 
* '''RAM:''' Approximately 22 GB for each node (64 GB in total)
 
* '''CPU:''' 15 cores for each node (45 cores in total)
 
* '''HDD:''' 100 GB for each node
 
  
===Software Requirements===
 
* OS: CentOS-7
 
Kubernetes cluster:
 
*[http://kubernetes.om/ Kubernetes 1.12+]
 
*[https://helm.sh/ Helm 2.11+ or Helm 3.0-beta3+]
 
*[https://www.postgresql.org/ PostgreSQL]
 
*[https://redis.io/ Redis 5+]
 
 
*Rancher Kubernetes Deployment
 
*Client-side utilities installed at deployment host:
 
*:*[https://kubernetes.io/docs/tasks/tools/install-kubectl/ Kubectl] tool
 
*:*Helm
 
 
=== Workspace Web Requirements ===
 
* Browser:
 
*:* Google Chrome 75+
 
*:* Mozilla Firefox 68+
 
*:* Firefox ESR 60.9
 
*:* Microsoft Internet Explorer 11
 
*:* Microsoft Edge
 
-->
 
 
==Configuring Web Services and Applications==
 
==Configuring Web Services and Applications==
 
To configure Web Services and Applications, refer to [[Documentation:HTCC:Dep:ConfigurationPremise|Configuring Web Services and Applications]].
 
To configure Web Services and Applications, refer to [[Documentation:HTCC:Dep:ConfigurationPremise|Configuring Web Services and Applications]].
Line 42: Line 20:
 
Transport Layer Security (TLS) is available only in Kubernetes-based deployment. For more details, refer to [[Documentation:HTCC:Dep:Security|Configuring Security]].
 
Transport Layer Security (TLS) is available only in Kubernetes-based deployment. For more details, refer to [[Documentation:HTCC:Dep:Security|Configuring Security]].
  
== Deploying GWS ==
+
== Deploying GWS==
 
<ol>
 
<ol>
<li>Unpack the installation package (e.g. IP_HTCCDev_9000253b1_ENU_dockerlinux.zip file) and navigate to the '''ip''' folder which contains the following files:
+
<li>Unpack the installation package (e.g. '''IP_HTCCDev_9000253b1_ENU_dockerlinux.zip''' file) and navigate to the '''ip''' folder that contains the following files:
 
* '''gws-microservices.tgz'''
 
* '''gws-microservices.tgz'''
 
* exported microservices in tar.gz format (e.g. '''gws-platform-configuration_9.0.000.42.tar.gz''')
 
* exported microservices in tar.gz format (e.g. '''gws-platform-configuration_9.0.000.42.tar.gz''')
Line 58: Line 36:
 
for i in *.tar.gz; do /opt/genesys/gws/kubernetes/bin/push-containers-to-local-registry.sh $i %corporate_registry_address% --push; done
 
for i in *.tar.gz; do /opt/genesys/gws/kubernetes/bin/push-containers-to-local-registry.sh $i %corporate_registry_address% --push; done
 
</source>
 
</source>
{{NoteFormat|This script must be run with Docker-capable privileges and you must login to your registry before pushing.}}
+
{{NoteFormat|This script must be run with Docker-capable privileges and you must log in to your registry before pushing.}}
 
</li>
 
</li>
 
<li>Edit the following values in the '''/opt/genesys/gws/kubernetes/parameters.yaml''' file:
 
<li>Edit the following values in the '''/opt/genesys/gws/kubernetes/parameters.yaml''' file:
Line 68: Line 46:
 
| valign="top" |
 
| valign="top" |
 
'''Description'''
 
'''Description'''
 +
|-
 +
| valign="top" |
 +
DEPLOYMENT_TYPE
 +
| valign="top" |
 +
ALL
 +
| valign="top" |
 +
Controls the microservices that will be deployed. <br>
 +
'''ALL''' - All microservices from the package. <br>
 +
'''CXCONLY''' - All requirements for CXC.
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
Line 81: Line 68:
 
<nowiki>onpremiselab.com</nowiki>
 
<nowiki>onpremiselab.com</nowiki>
 
| valign="top" |
 
| valign="top" |
The host name that will be used by Ingress for routing rules creation.
+
Contact center domain information. Used during post deployment provisioning when POST_DEPLOY_UPDATE is set to <tt>true</tt>. <br>
'''Note:''' If '''ingressTlsEnable''' is <tt>true</tt>, the deployment will be accessible though <nowiki>https://GWS_DOMAIN/ui/wwe/</nowiki>. If not, the deployment will be accessible through <nowiki>http://GWS_DOMAIN/ui/wwe/</nowiki>.  
+
'''Note:''' Contact center domain information must be provided during each Web Services and Applications login in the "Tenant" field.  
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
Line 93: Line 80:
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
CS_USERNAME
+
CS_USER
 
| valign="top" |
 
| valign="top" |
 
default
 
default
Line 100: Line 87:
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
CS_PASSWORD
+
CS_PASS
 
| valign="top" |
 
| valign="top" |
 
password
 
password
Line 107: Line 94:
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
CS_APPNAME
+
CS_APP_NAME
 
| valign="top" |
 
| valign="top" |
GWS_App
+
Cloud
 
| valign="top" |
 
| valign="top" |
Application name to connect to Configuration Server. For details, refer to [[ConfigurationPremise#gaxgwsclient| Creating GWS Client Application]].
+
Application name to connect to Configuration Server. <!--For details, refer to [[ConfigurationPremise#gaxgwsclient| Creating GWS Client Application]]-->
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
Line 156: Line 143:
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
ingressTlsEnable
+
POSTGRES_PORT
 
| valign="top" |
 
| valign="top" |
false
+
5432
 
| valign="top" |
 
| valign="top" |
Enables Ingress secured endpoint configuration for Web Services and Applications.<br>
+
Port of PostgreSQL installation.
'''Note''': Refer to [[Documentation:HTCC:Dep:Security|Configuring Security]] for more details.
 
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
Line 168: Line 154:
 
false
 
false
 
| valign="top" |
 
| valign="top" |
Enables the post deployment procedure, which creates the default Genesys environment, contact center and OAuth client. <br>
+
Enables the post deployment procedure that creates the default Genesys environment, contact center, and OAuth client.  
'''Note:''' If '''POST_DEPLOY_UPDATE''' is set to <tt>true</tt>, '''GWS_DOMAIN''' is used when the contact center domain is created, and agents should provide domain information at login ('''GWS_DOMAIN\%CfgPerson's username%''').  
 
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
Line 222: Line 207:
 
REDIS_ADDR
 
REDIS_ADDR
 
| valign="top" |
 
| valign="top" |
redis-cluster:6379
+
redis-cluster
 
| valign="top" |
 
| valign="top" |
 
Address of the Redis cluster installation. <br>
 
Address of the Redis cluster installation. <br>
 
'''Note''': If DEPLOY_REDIS is set to <tt>true</tt>, the default value is used.
 
'''Note''': If DEPLOY_REDIS is set to <tt>true</tt>, the default value is used.
 +
|-
 +
| valign="top" |
 +
REDIS_PORT
 +
| valign="top" |
 +
6379
 +
| valign="top" |
 +
Port of the Redis cluster installation.
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
Line 232: Line 224:
 
false
 
false
 
| valign="top" |
 
| valign="top" |
Enables ElasticSearch cluster deployment procedure in same namespace as Web Services and Applications.<br>
+
Enables ElasticSearch cluster deployment procedure in the same namespace as Web Services and Applications.<br>
 
'''Note:''' For lab deployments only.
 
'''Note:''' For lab deployments only.
 
|-
 
|-
Line 238: Line 230:
 
ELASTICSEARCH
 
ELASTICSEARCH
 
| valign="top" |
 
| valign="top" |
elasticsearch:9200
+
elasticsearch
 
| valign="top" |
 
| valign="top" |
 
Address of the Elasticsearch cluster installation.<br>
 
Address of the Elasticsearch cluster installation.<br>
 
'''Note''': If DEPLOY_ELASTICSEARCH is set to <tt>true</tt>, the default value is used.
 
'''Note''': If DEPLOY_ELASTICSEARCH is set to <tt>true</tt>, the default value is used.
 +
|-
 +
| valign="top" |
 +
ELASTICSEARCH_PORT
 +
| valign="top" |
 +
9200
 +
| valign="top" |
 +
Port of the Elasticsearch cluster installation.
 +
|-
 +
| valign="top" |
 +
entryPoint.internal.service.type
 +
| valign="top" |
 +
LoadBalancer
 +
| valign="top" |
 +
Internal endpoint configuration service type for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.internal.service.annotations
 +
| valign="top" |
 +
{}
 +
| valign="top" |
 +
Optional internal service endpoint configuration for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.internal.ingress.annotations
 +
| valign="top" |
 +
{}
 +
| valign="top" |
 +
Optional internal ingress endpoint configuration annotations for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.internal.ingress.tlsEnable
 +
| valign="top" |
 +
false
 +
| valign="top" |
 +
Enables ingress-secured internal endpoint configuration for Web Service and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.internal.ingress.secretName
 +
| valign="top" |
 +
gws-secret-int
 +
| valign="top" |
 +
Internal ingress endpoint configuration secret name for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.internal.ingress.hostName
 +
| valign="top" |
 +
gws-int.test.com
 +
| valign="top" |
 +
The hostname, which will be used for internal ingress configuration.
 +
|-
 +
| valign="top" |
 +
entryPoint.external.service.type
 +
| valign="top" |
 +
ClusterIP
 +
| valign="top" |
 +
External endpoint configuration service type for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.external.service.annotations
 +
| valign="top" |
 +
{}
 +
| valign="top" |
 +
Optional external service endpoint configuration for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.external.ingress.annotations
 +
| valign="top" |
 +
{}
 +
| valign="top" |
 +
Optional external ingress endpoint configuration annotations for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.external.ingress.tlsEnable
 +
| valign="top" |
 +
false
 +
| valign="top" |
 +
Enables ingress secured external endpoint configuration for Web Service and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.external.ingress.secretName
 +
| valign="top" |
 +
gws-secret-ext
 +
| valign="top" |
 +
External ingress endpoint configuration secret name for Web Services and Applications.
 +
|-
 +
| valign="top" |
 +
entryPoint.external.ingress.hostName
 +
| valign="top" |
 +
<nowiki>http://onpremiselab.com</nowiki>
 +
| valign="top" |
 +
The hostname that will be used for external ingress configuration. <br>
 +
'''Note:''' If entryPoint.external.ingress.tlsEnable is <tt>true</tt>, the deployment will be accessible through <nowiki>https://entryPoint.external.ingress.hostName/ui/wwe/</nowiki>, else the deployment will be accessible through <nowiki>http://entryPoint.external.ingress.hostName/ui/wwe/</nowiki>.
 
|}
 
|}
 
</li>
 
</li>
Line 259: Line 343:
 
<li>Wait until the Helm-deployed Web Services and Applications and Kubernetes cluster start all the requested containers.</li>
 
<li>Wait until the Helm-deployed Web Services and Applications and Kubernetes cluster start all the requested containers.</li>
 
</ol>
 
</ol>
 
  
 
==Verification ==
 
==Verification ==
Use the following links to get the expected versions of the Web Services and Applications components and verify they are correct:
+
Use the following URLs to get the expected versions of the Web Services and Applications components and verify they are correct:
  
 
{|
 
{|
Line 273: Line 356:
 
Authentication Service
 
Authentication Service
 
| valign="top" |
 
| valign="top" |
<nowiki> http://GWS_DOMAIN/auth/v3/version</nowiki>
+
<nowiki>http://entryPoint.internal.ingress.hostName/auth/v3/version</nowiki>
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
 
Configuration Service
 
Configuration Service
 
| valign="top" |
 
| valign="top" |
<nowiki>http://GWS_DOMAIN/configuration/v3/version</nowiki>
+
<nowiki>http://entryPoint.internal.ingress.hostName/configuration/v3/version</nowiki>
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
 
Environment Service
 
Environment Service
 
| valign="top" |
 
| valign="top" |
<nowiki>http://GWS_DOMAIN/environment/v3/version</nowiki>
+
<nowiki>http://entryPoint.internal.ingress.hostName/environment/v3/version</nowiki>
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
 
Data Collector Service
 
Data Collector Service
 
| valign="top" |
 
| valign="top" |
<nowiki>http://GWS_DOMAIN/datacollector/v3/version</nowiki>
+
<nowiki>http://entryPoint.internal.ingress.hostName/datacollector/v3/version</nowiki>
 
|-
 
|-
 
| valign="top" |
 
| valign="top" |
 
Workspace Web Edition
 
Workspace Web Edition
 
| valign="top" |
 
| valign="top" |
<nowiki>http://GWS_DOMAIN/ui/wwe/index.html</nowiki>
+
<nowiki>http://entryPoint.external.ingress.hostName/ui/wwe/index.html</nowiki>
 
|}
 
|}
  
 
[[Category:V:HTCC:9.0.0]]
 
[[Category:V:HTCC:9.0.0]]

Revision as of 19:56, September 28, 2020

Deployment of Web Services and Applications in Kubernetes

Warning
  • Only a Helm v3 deployment method is supported.
  • High Availability (HA) is provided through N+1 architecture.
  • Disaster Recovery (DR) – Contact your Genesys representative and the Architecture team for guidance about recommended DR designs.

Prerequisites

For hardware, software, Workspace Web Edition, and Gplus Adapter for Salesforce requirements, refer to Prerequisites. Also, ensure your environment has access to docker.io/library. If internet access is not available, manually load the following public container images to the Docker registry:

Configuring Web Services and Applications

To configure Web Services and Applications, refer to Configuring Web Services and Applications.

Configuring Security

Transport Layer Security (TLS) is available only in Kubernetes-based deployment. For more details, refer to Configuring Security.

Deploying GWS

  1. Unpack the installation package (e.g. IP_HTCCDev_9000253b1_ENU_dockerlinux.zip file) and navigate to the ip folder that contains the following files:
    • gws-microservices.tgz
    • exported microservices in tar.gz format (e.g. gws-platform-configuration_9.0.000.42.tar.gz)
  2. Unpack the gws-microservices.tgz archive to the /opt/genesys/gws directory.
    mkdir -p /opt/genesys/gws
    tar xvf gws-microservices.tgz -C /opt/genesys/gws
  3. Populate Docker images (presented in *.tar.gz format) from the installation package to your corporate docker registry.
    for i in *.tar.gz; do /opt/genesys/gws/kubernetes/bin/push-containers-to-local-registry.sh $i %corporate_registry_address% --push; done
    Important
    This script must be run with Docker-capable privileges and you must log in to your registry before pushing.
  4. Edit the following values in the /opt/genesys/gws/kubernetes/parameters.yaml file:

    Variable

    Default Value

    Description

    DEPLOYMENT_TYPE

    ALL

    Controls the microservices that will be deployed.
    ALL - All microservices from the package.
    CXCONLY - All requirements for CXC.

    REGISTRY

    Corporate docker registry, which is accessible from all Kubernetes nodes.

    GWS_DOMAIN

    onpremiselab.com

    Contact center domain information. Used during post deployment provisioning when POST_DEPLOY_UPDATE is set to true.
    Note: Contact center domain information must be provided during each Web Services and Applications login in the "Tenant" field.

    LOCATION

    /USW2

    Location of Configuration Server.
    Note: The GWS cluster application object (typically named CloudCluster) in the Configuration Database must be configured with a specified location for each connection to Genesys servers, such as Configuration Server, Stat Server, T-Server, and so on. This setting defines which server instance is visible by the GWS node based on its position in the GWS cluster.

    CS_USER

    default

    Username to connect to Configuration Server.

    CS_PASS

    password

    Password to connect to Configuration Server.

    CS_APP_NAME

    Cloud

    Application name to connect to Configuration Server.

    CS_ADDRESS

    127.0.0.1

    Address of the primary Configuration Server.

    CS_PORT

    8888

    Port of the primary Configuration Server.

    CS_BACKUP_ADDRESS

    127.0.0.1

    Address of the backup Configuration Server.

    CS_BACKUP_PORT

    8888

    Port of the backup Configuration Server.

    CS_TENANT

    Environment

    Configuration Server's tenant name.

    GWS_REDIRECT_URI

    http://onpremiselab.com

    Specifies an array by using double quotes and a comma to separate values with no white space in between. Used as part of OAuth authentication flow.

    POSTGRES_PORT

    5432

    Port of PostgreSQL installation.

    POST_DEPLOY_UPDATE

    false

    Enables the post deployment procedure that creates the default Genesys environment, contact center, and OAuth client.

    DEPLOY_POSTGRES

    false

    Enables the PostgreSQL deployment procedure in the same namespace as Web Services and Applications.
    Note: For lab deployments only.

    POSTGRES_ADDR

    postgres

    Address of the PostgreSQL installation.
    Note: If DEPLOY_POSTGRES is set to true, the default value is used.

    POSTGRES_DB

    gws_environment

    PostgreSQL database name.
    Note: If DEPLOY_POSTGRES is set to true, the default value is used.

    POSTGRES_USER

    gws_env_master

    PostgreSQL user, which can be used to connect to database.
    Note: If DEPLOY_POSTGRES is set to true, the default value is used.

    POSTGRES_PASS

    gws_env_password

    PostgreSQL user password.
    Note: If DEPLOY_POSTGRES is set to true, the default value is used.

    DEPLOY_REDIS

    false

    Enables the Redis cluster deployment procedure in the same namespace as Web Services and Applications.
    Note: For lab deployments only.

    REDIS_ADDR

    redis-cluster

    Address of the Redis cluster installation.
    Note: If DEPLOY_REDIS is set to true, the default value is used.

    REDIS_PORT

    6379

    Port of the Redis cluster installation.

    DEPLOY_ELASTICSEARCH

    false

    Enables ElasticSearch cluster deployment procedure in the same namespace as Web Services and Applications.
    Note: For lab deployments only.

    ELASTICSEARCH

    elasticsearch

    Address of the Elasticsearch cluster installation.
    Note: If DEPLOY_ELASTICSEARCH is set to true, the default value is used.

    ELASTICSEARCH_PORT

    9200

    Port of the Elasticsearch cluster installation.

    entryPoint.internal.service.type

    LoadBalancer

    Internal endpoint configuration service type for Web Services and Applications.

    entryPoint.internal.service.annotations

    {}

    Optional internal service endpoint configuration for Web Services and Applications.

    entryPoint.internal.ingress.annotations

    {}

    Optional internal ingress endpoint configuration annotations for Web Services and Applications.

    entryPoint.internal.ingress.tlsEnable

    false

    Enables ingress-secured internal endpoint configuration for Web Service and Applications.

    entryPoint.internal.ingress.secretName

    gws-secret-int

    Internal ingress endpoint configuration secret name for Web Services and Applications.

    entryPoint.internal.ingress.hostName

    gws-int.test.com

    The hostname, which will be used for internal ingress configuration.

    entryPoint.external.service.type

    ClusterIP

    External endpoint configuration service type for Web Services and Applications.

    entryPoint.external.service.annotations

    {}

    Optional external service endpoint configuration for Web Services and Applications.

    entryPoint.external.ingress.annotations

    {}

    Optional external ingress endpoint configuration annotations for Web Services and Applications.

    entryPoint.external.ingress.tlsEnable

    false

    Enables ingress secured external endpoint configuration for Web Service and Applications.

    entryPoint.external.ingress.secretName

    gws-secret-ext

    External ingress endpoint configuration secret name for Web Services and Applications.

    entryPoint.external.ingress.hostName

    http://onpremiselab.com

    The hostname that will be used for external ingress configuration.
    Note: If entryPoint.external.ingress.tlsEnable is true, the deployment will be accessible through https://entryPoint.external.ingress.hostName/ui/wwe/, else the deployment will be accessible through http://entryPoint.external.ingress.hostName/ui/wwe/.

  5. Navigate to /opt/genesys/gws/kubernetes.
  6. Invoke Helm:
    helm install gws gws/ -n gws-service -f gws-versions.yaml -f parameters.yaml

    Where:

    • gws is the name of deployment.
    • gws/ is the helm chart directory.
    • -n gws-service is the Kubernetes namespace name to deploy to.
    • -f gws-versions.yaml is the config file where versions of containers are defined.
    • -f parameters.yaml is the config file where deployment parameters are defined.
  7. Wait until the Helm-deployed Web Services and Applications and Kubernetes cluster start all the requested containers.

Verification

Use the following URLs to get the expected versions of the Web Services and Applications components and verify they are correct:

Service

Verification URLs

Authentication Service

http://entryPoint.internal.ingress.hostName/auth/v3/version

Configuration Service

http://entryPoint.internal.ingress.hostName/configuration/v3/version

Environment Service

http://entryPoint.internal.ingress.hostName/environment/v3/version

Data Collector Service

http://entryPoint.internal.ingress.hostName/datacollector/v3/version

Workspace Web Edition

http://entryPoint.external.ingress.hostName/ui/wwe/index.html

Comments or questions about this documentation? Contact us for support!