# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# In this file users can store their cloud login credentials for convenience
# If this file exists it is sourced by Whirr scripts.
#
# Whirr will look for this file in the home directory first (~/.whirr/credentials)
# If not found it will look for it in the conf directory.
#
# Preset environment variables will take precedence over these files.
#
# VARIABLES:
#
# PROVIDER - The cloud provider to use in Whirr
# IDENTITY - The identity to use in Whirr
# CREDENTIAL - The credential to use in Whirr
#
# BLOBSTORE_* - Overrides the base variables (e.g. PROVIDER) specifically for
# blobstore contexts. Base variables are still used for compute access
# If BLOBSTORE_* variables are not defined Whirr will use the base variables
# for blobstore access.

# Users can assign these variables the values they want to assign to
# their WHIRR_* variable counterparts. If a WHIRR_* variable is found in env
# then it takes precedence (to be able to do one-off overrides on recipes)
# otherwise WHIRR_* variables take the value from this file. Finally .properties
# files override both this file and previous env variables

# Set cloud provider connection details

PROVIDER=
IDENTITY=
CREDENTIAL=

# Set blob store connection details. If not defined they are computed
# from the cloud provider connection details defined above

# BLOBSTORE_PROVIDER=
# BLOBSTORE_IDENTITY=
# BLOBSTORE_CREDENTIAL=

