Skip to content
This repository was archived by the owner on Jun 30, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ $ ansible-galaxy install Jimdo.fastly
| settings | false | Settings object | |
| s3s | false | List of S3 loggers | |
| syslogs | false | List of Syslog loggers | |
| cloudfiles | false | List of CloudFiles loggers | |
| vcl_snippets | false | List of VCL snippets | |

### Backend
Expand Down Expand Up @@ -221,6 +222,28 @@ $ ansible-galaxy install Jimdo.fastly
| use_tls | false | int | 0 |


### CloudFiles Logging

[Fastly documentation](https://docs.fastly.com/api/logging#logging_cloudfiles)

| Field | Required | Type | Default |
|:----------------------------------|:---------|:-----------------------------------------------|:-------------------------------------|
| name | true | string | |
| access_key | false | string | |
| bucket_name | false | string | |
| format | false | string | %{%Y-%m-%dT%H:%M:%S}t %h "%r" %>s %b |
| format_version | false | integer | 2 |
| gzip_level | false | integer | 0 |
| message_type | false | enum ('classic', 'loggly', 'logplex', 'blank') | classic |
| path | false | string | / |
| period | false | integer | 3600 |
| placement | false | string | |
| region | false | string | |
| response_condition | false | string | '' |
| timestamp_format | false | string | %Y-%m-%dT%H |
| user | true | string | |


### Settings

[Fastly documentation](https://docs.fastly.com/api/config#settings)
Expand Down
76 changes: 76 additions & 0 deletions library/fastly_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@
required: false
description:
- List of Syslog loggers
cloudfiles:
required: false
description:
- List of CloudFiles loggers
settings:
required: false
description:
Expand Down Expand Up @@ -605,6 +609,44 @@ def sort_key(f):
return f.name


class FastlyCloudFilesLogging(FastlyObject):
schema = {
'name': dict(required=True, type='str', default=None),
'access_key': dict(required=False, type='str', default=None),
'bucket_name': dict(required=False, type='str', default=None),
'format': dict(required=False, type='str', default='%{%Y-%m-%dT%H:%M:%S}t %h "%r" %>s %b'),
'format_version': dict(required=False, type='int', default=2),
'gzip_level': dict(required=False, type='int', default=0),
'message_type': dict(required=False, type='str', default="classic", choices=['classic', 'loggly', 'logplex', 'blank', None]),
'path': dict(required=False, type='str', default='/'),
'period': dict(required=False, type='int', default=3600),
'placement': dict(required=False, type='str', default=None),
'region': dict(required=False, type='str', default=None, exclude_empty_str=True),
'response_condition': dict(required=False, type='str', default=None, exclude_empty_str=True),
'timestamp_format': dict(required=False, type='str', default='%Y-%m-%dT%H'),
'user': dict(required=True, type='str', default=None),
}

def __init__(self, config, validate_choices):
self.name = self.read_config(config, validate_choices, 'name')
self.access_key = self.read_config(config, validate_choices, 'access_key')
self.bucket_name = self.read_config(config, validate_choices, 'bucket_name')
self.format = self.read_config(config, validate_choices, 'format')
self.format_version = self.read_config(config, validate_choices, 'format_version')
self.gzip_level = self.read_config(config, validate_choices, 'gzip_level')
self.message_type = self.read_config(config, validate_choices, 'message_type')
self.path = self.read_config(config, validate_choices, 'path')
self.period = self.read_config(config, validate_choices, 'period')
self.placement = self.read_config(config, validate_choices, 'placement')
self.region = self.read_config(config, validate_choices, 'region')
self.response_condition = self.read_config(config, validate_choices, 'response_condition')
self.timestamp_format = self.read_config(config, validate_choices, 'timestamp_format')
self.user = self.read_config(config, validate_choices, 'user')

def sort_key(f):
return f.name


class FastlySettings(FastlyObject):
schema = {
'general.default_ttl': dict(required=False, type='int', default=3600)
Expand Down Expand Up @@ -634,6 +676,7 @@ def __init__(self, cfg, validate_choices=True):
self.snippets = [FastlyVclSnippet(s, validate_choices) for s in cfg.get('snippets') or []]
self.s3s = [FastlyS3Logging(s, validate_choices) for s in cfg.get('s3s') or []]
self.syslogs = [FastlySyslogLogging(s, validate_choices) for s in cfg.get('syslogs') or []]
self.cloudfiles = [FastlyCloudFilesLogging(s, validate_choices) for s in cfg.get('cloudfiles') or []]
self.settings = FastlySettings(cfg.get('settings'), validate_choices)

def __eq__(self, other):
Expand All @@ -650,6 +693,7 @@ def __eq__(self, other):
and sorted(self.snippets, key=FastlyVclSnippet.sort_key) == sorted(other.snippets, key=FastlyVclSnippet.sort_key) \
and sorted(self.s3s, key=FastlyS3Logging.sort_key) == sorted(other.s3s, key=FastlyS3Logging.sort_key) \
and sorted(self.syslogs, key=FastlySyslogLogging.sort_key) == sorted(other.syslogs, key=FastlySyslogLogging.sort_key) \
and sorted(self.cloudfiles, key=FastlyCloudFilesLogging.sort_key) == sorted(other.cloudfiles, key=FastlyCloudFilesLogging.sort_key) \
and self.settings == other.settings

def __ne__(self, other):
Expand Down Expand Up @@ -1060,6 +1104,29 @@ def delete_syslog_logger(self, service_id, version, syslog_logger):
raise Exception("Error deleting syslog logger %s service %s, version %s (%s)" % (
syslog_logger, service_id, version, response.error()))

def get_cloudfiles_loggers(self, service_id, version):
response = self._request('/service/%s/version/%s/logging/cloudfiles' % (urllib.quote(service_id, ''), version), 'GET')
if response.status == 200:
return response.payload
raise Exception(
"Error retrieving cloudfiles loggers for service %s, version %s (%s)" % (service_id, version, response.error()))

def create_cloudfiles_logger(self, service_id, version, cloudfiles):
response = self._request('/service/%s/version/%s/logging/cloudfiles' % (service_id, version), 'POST', cloudfiles)

if response.status == 200:
return response.payload
else:
raise Exception("Error creating cloudfiles logger '%s' for service %s, version %s (%s)" % (cloudfiles.name, service_id, version, response.error()))

def delete_cloudfiles_logger(self, service_id, version, cloudfiles_logger):
response = self._request('/service/%s/version/%s/logging/cloudfiles/%s' % (urllib.quote(service_id, ''), version, urllib.quote(cloudfiles_logger, '')),
'DELETE')
if response.status == 200:
return response.payload
raise Exception("Error deleting cloudfiles logger %s service %s, version %s (%s)" % (
cloudfiles_logger, service_id, version, response.error()))

def create_settings(self, service_id, version, settings):
response = self._request('/service/%s/version/%s/settings' % (urllib.quote(service_id, ''), version), 'PUT', settings)
if response.status == 200:
Expand Down Expand Up @@ -1136,6 +1203,7 @@ def reset_version(self, service_id, version_to_delete):
snippets = self.client.get_vcl_snippet_name(service_id, version_to_delete)
s3_loggers = self.client.get_s3_loggers(service_id, version_to_delete)
syslog_loggers = self.client.get_syslog_loggers(service_id, version_to_delete)
cloudfiles_loggers = self.client.get_cloudfiles_loggers(service_id, version_to_delete)

for domain_name in domain:
self.client.delete_domain(service_id, version_to_delete, domain_name['name'])
Expand Down Expand Up @@ -1176,6 +1244,9 @@ def reset_version(self, service_id, version_to_delete):
for logger in syslog_loggers:
self.client.delete_syslog_logger(service_id, version_to_delete, logger['name'])

for logger in cloudfiles_loggers:
self.client.delete_cloudfiles_logger(service_id, version_to_delete, logger['name'])

def configure_version(self, service_id, configuration, version_number):
for domain in configuration.domains:
self.client.create_domain(service_id, version_number, domain)
Expand Down Expand Up @@ -1219,6 +1290,9 @@ def configure_version(self, service_id, configuration, version_number):
for logger in configuration.syslogs:
self.client.create_syslog_logger(service_id, version_number, logger)

for logger in configuration.cloudfiles:
self.client.create_cloudfiles_logger(service_id, version_number, logger)

if configuration.settings:
self.client.create_settings(service_id, version_number, configuration.settings)

Expand Down Expand Up @@ -1259,6 +1333,7 @@ def __init__(self):
vcl_snippets=dict(default=None, required=False, type='list'),
s3s=dict(default=None, required=False, type='list'),
syslogs=dict(default=None, required=False, type='list'),
cloudfiles=dict(default=None, required=False, type='list'),
settings=dict(default=None, required=False, type='dict'),
),
supports_check_mode=False
Expand Down Expand Up @@ -1289,6 +1364,7 @@ def configuration(self):
'snippets': self.module.params['vcl_snippets'],
's3s': self.module.params['s3s'],
'syslogs': self.module.params['syslogs'],
'cloudfiles': self.module.params['cloudfiles'],
'settings': self.module.params['settings']
})
except FastlyValidationError as err:
Expand Down
Loading