Skip to content
Merged
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
45 changes: 23 additions & 22 deletions library/fastly_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
required: false
description:
- List of Syslog loggers
upload_vcls:
vcls:
required: false
description:
- Upload VCL
Expand Down Expand Up @@ -426,11 +426,11 @@ def sort_key(f):

class FastlyHealthcheck(FastlyObject):
schema = {
'name': dict(required=True, type='str', default=None),
'name': dict(required=False, type='str', default=None),
'check_interval': dict(required=False, type='int', default=None),
'comment': dict(required=False, type='str', default=''),
'expected_response': dict(required=False, type='int', default=200),
'host': dict(required=True, type='str', default=None),
'host': dict(required=False, type='str', default=None),
'http_version': dict(required=False, type='str', default='1.1'),
'initial': dict(required=False, type='int', default=None),
'method': dict(required=False, type='str', default='HEAD'),
Expand Down Expand Up @@ -656,28 +656,28 @@ def __init__(self, cfg, validate_choices=True):
self.headers = [FastlyHeader(h, validate_choices) for h in cfg.get('headers') or []]
self.response_objects = [FastlyResponseObject(r, validate_choices) for r in cfg.get('response_objects') or []]
self.request_settings = [FastlyRequestSetting(r, validate_choices) for r in cfg.get('request_settings') or []]
self.uploads = []
self.custom_vcls = []
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.settings = FastlySettings(cfg.get('settings'), validate_choices)

def __eq__(self, other):
return sorted(self.domains, key=FastlyDomain.sort_key) == sorted(other.domains, key=FastlyDomain.sort_key) \
and sorted(self.healthchecks, key=FastlyHealthcheck.sort_key) == sorted(other.healthchecks, key=FastlyHealthcheck.sort_key) \
and sorted(self.backends, key=FastlyBackend.sort_key) == sorted(other.backends, key=FastlyBackend.sort_key) \
and sorted(self.cache_settings, key=FastlyCacheSettings.sort_key) == sorted(other.cache_settings, key=FastlyCacheSettings.sort_key) \
and sorted(self.conditions, key=FastlyCondition.sort_key) == sorted(other.conditions, key=FastlyCondition.sort_key) \
and sorted(self.directors, key=FastlyDirector.sort_key) == sorted(other.directors, key=FastlyDirector.sort_key) \
and sorted(self.gzips, key=FastlyGzip.sort_key) == sorted(other.gzips, key=FastlyGzip.sort_key) \
and sorted(self.headers, key=FastlyHeader.sort_key) == sorted(other.headers, key=FastlyHeader.sort_key) \
and sorted(self.request_settings, key=FastlyRequestSetting.sort_key) == sorted(other.request_settings, key=FastlyRequestSetting.sort_key) \
and sorted(self.response_objects, key=FastlyResponseObject.sort_key) == sorted(other.response_objects, key=FastlyResponseObject.sort_key) \
and sorted(self.uploads, key=FastlyVclUpload.sort_key) == sorted(other.uploads, key=FastlyVclUpload.sort_key) \
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 self.settings == other.settings
and sorted(self.healthchecks, key=FastlyHealthcheck.sort_key) == sorted(other.healthchecks, key=FastlyHealthcheck.sort_key) \
and sorted(self.backends, key=FastlyBackend.sort_key) == sorted(other.backends, key=FastlyBackend.sort_key) \
and sorted(self.cache_settings, key=FastlyCacheSettings.sort_key) == sorted(other.cache_settings, key=FastlyCacheSettings.sort_key) \
and sorted(self.conditions, key=FastlyCondition.sort_key) == sorted(other.conditions, key=FastlyCondition.sort_key) \
and sorted(self.directors, key=FastlyDirector.sort_key) == sorted(other.directors, key=FastlyDirector.sort_key) \
and sorted(self.gzips, key=FastlyGzip.sort_key) == sorted(other.gzips, key=FastlyGzip.sort_key) \
and sorted(self.headers, key=FastlyHeader.sort_key) == sorted(other.headers, key=FastlyHeader.sort_key) \
and sorted(self.request_settings, key=FastlyRequestSetting.sort_key) == sorted(other.request_settings, key=FastlyRequestSetting.sort_key) \
and sorted(self.response_objects, key=FastlyResponseObject.sort_key) == sorted(other.response_objects, key=FastlyResponseObject.sort_key) \
and sorted(self.custom_vcls, key=FastlyVclUpload.sort_key) == sorted(other.custom_vcls, key=FastlyVclUpload.sort_key) \
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 self.settings == other.settings

def __ne__(self, other):
return not self.__eq__(other)
Expand Down Expand Up @@ -1243,7 +1243,8 @@ def configure_version(self, service_id, configuration, version_number):

# create healthchecks before backends
for healthcheck in configuration.healthchecks:
self.client.create_healthcheck(service_id, version_number, healthcheck)
if healthcheck.name:
self.client.create_healthcheck(service_id, version_number, healthcheck)

# create conditions before dependencies (e.g. cache_settings)
for condition in configuration.conditions:
Expand Down Expand Up @@ -1271,7 +1272,7 @@ def configure_version(self, service_id, configuration, version_number):
for response_object in configuration.response_objects:
self.client.create_response_object(service_id, version_number, response_object)

for upload_vcl in configuration.uploads:
for upload_vcl in configuration.custom_vcls:
self.client.upload_custom_vcl(service_id, version_number, upload_vcl)

for vcl_snippet in configuration.snippets:
Expand Down Expand Up @@ -1320,7 +1321,7 @@ def __init__(self):
headers=dict(default=None, required=False, type='list'),
request_settings=dict(default=None, required=False, type='list'),
response_objects=dict(default=None, required=False, type='list'),
upload_vcls=dict(default=None, required=False, type='list'),
vcls=dict(default=None, required=False, type='list'),
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'),
Expand Down Expand Up @@ -1351,7 +1352,7 @@ def configuration(self):
'headers': self.module.params['headers'],
'request_settings': self.module.params['request_settings'],
'response_objects': self.module.params['response_objects'],
'uploads': self.module.params['upload_vcls'],
'custom_vcls': self.module.params['vcls'],
'snippets': self.module.params['vcl_snippets'],
's3s': self.module.params['s3s'],
'syslogs': self.module.params['syslogs'],
Expand Down
123 changes: 123 additions & 0 deletions tests/test_fastly_vcls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
#!/usr/bin/env python
import os
import unittest
import sys

from test_common import TestCommon

sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'library'))
from fastly_service import FastlyConfiguration

class TestFastlyVclSnippets(TestCommon):

VCLS_NAME = 'Main.vcl';

@TestCommon.vcr.use_cassette()
def test_fastly_vcl_main(self):
content = '''
sub vcl_recv {
#FASTLY recv

if (req.method != "HEAD" && req.method != "GET" && req.method != "FASTLYPURGE") {
return(pass);
}

return(lookup);
}

sub vcl_fetch {
#FASTLY fetch

if ((beresp.status == 500 || beresp.status == 503) && req.restarts < 1 && (req.method == "GET" || req.method == "HEAD")) {
restart;
}

if (req.restarts > 0) {
set beresp.http.Fastly-Restarts = req.restarts;
}

if (beresp.http.Set-Cookie) {
set req.http.Fastly-Cachetype = "SETCOOKIE";
return(pass);
}

if (beresp.http.Cache-Control ~ "private") {
set req.http.Fastly-Cachetype = "PRIVATE";
return(pass);
}

if (beresp.status == 500 || beresp.status == 503) {
set req.http.Fastly-Cachetype = "ERROR";
set beresp.ttl = 1s;
set beresp.grace = 5s;
return(deliver);
}

if (beresp.http.Expires || beresp.http.Surrogate-Control ~ "max-age" || beresp.http.Cache-Control ~ "(s-maxage|max-age)") {
# keep the ttl here
} else {
# apply the default ttl
set beresp.ttl = 3600s;
}

return(deliver);
}

sub vcl_hit {
#FASTLY hit

if (!obj.cacheable) {
return(pass);
}
return(deliver);
}

sub vcl_miss {
#FASTLY miss
return(fetch);
}

sub vcl_deliver {
#FASTLY deliver
return(deliver);
}

sub vcl_error {
#FASTLY error
}

sub vcl_pass {
#FASTLY pass
}

sub vcl_log {
#FASTLY log
}
'''

vcls_configuration = self.minimal_configuration.copy()
vcls_configuration.update({
'snippets': [{
'name': self.VCLS_NAME,
'dynamic': 0,
'type': 'deliver',
'content': content,
}]
})

configuration = FastlyConfiguration(vcls_configuration)
service = self.enforcer.apply_configuration(self.FASTLY_TEST_SERVICE, configuration).service

self.assertEqual(service.active_version.configuration.vcls[0].name, self.VCLS_NAME)
self.assertEqual(service.active_version.configuration.vcls[0].dynamic, 0)
self.assertEqual(service.active_version.configuration.vcls[0].type, 'deliver')
self.assertEqual(service.active_version.configuration.vcls[0].content, content)
self.assertEqual(service.active_version.configuration, configuration)

active_version_number = service.active_version.number
service = self.enforcer.apply_configuration(self.FASTLY_TEST_SERVICE, configuration).service
self.assertEqual(service.active_version.number, active_version_number)

if __name__ == '__main__':
unittest.main()