From 75ad900e027a14037b65cc0895460549a66ff5ed Mon Sep 17 00:00:00 2001 From: Ezekiel Templin Date: Mon, 4 May 2020 14:32:59 -0700 Subject: [PATCH] Add Kafka endpoint support --- fastly/fastly_test.go | 20 ++ fastly/fixtures/kafkas/cleanup.yaml | 95 +++++++++ fastly/fixtures/kafkas/create.yaml | 180 ++++++++++++++++ fastly/fixtures/kafkas/delete.yaml | 47 ++++ fastly/fixtures/kafkas/get.yaml | 53 +++++ fastly/fixtures/kafkas/list.yaml | 53 +++++ fastly/fixtures/kafkas/update.yaml | 65 ++++++ fastly/fixtures/kafkas/version.yaml | 51 +++++ fastly/kafka.go | 255 ++++++++++++++++++++++ fastly/kafka_test.go | 319 ++++++++++++++++++++++++++++ 10 files changed, 1138 insertions(+) create mode 100644 fastly/fixtures/kafkas/cleanup.yaml create mode 100644 fastly/fixtures/kafkas/create.yaml create mode 100644 fastly/fixtures/kafkas/delete.yaml create mode 100644 fastly/fixtures/kafkas/get.yaml create mode 100644 fastly/fixtures/kafkas/list.yaml create mode 100644 fastly/fixtures/kafkas/update.yaml create mode 100644 fastly/fixtures/kafkas/version.yaml create mode 100644 fastly/kafka.go create mode 100644 fastly/kafka_test.go diff --git a/fastly/fastly_test.go b/fastly/fastly_test.go index 773fc6656..eee843bef 100644 --- a/fastly/fastly_test.go +++ b/fastly/fastly_test.go @@ -380,3 +380,23 @@ Zfq6/HA3phy85qyj -----END CERTIFICATE----- ` } + +// caCert returns a CA certificate suitable for testing +func caCert() string { + return `-----BEGIN CERTIFICATE----- +MIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL +MAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC +VU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx +NDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD +TjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu +ZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j +V14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj +gbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA +FFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE +CBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS +BgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE +BQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju +Wm7DCfrPNGVwFWUQOmsPue9rZBgO +-----END CERTIFICATE----- +` +} diff --git a/fastly/fixtures/kafkas/cleanup.yaml b/fastly/fixtures/kafkas/cleanup.yaml new file mode 100644 index 000000000..57583ff56 --- /dev/null +++ b/fastly/fixtures/kafkas/cleanup.yaml @@ -0,0 +1,95 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/120/logging/kafka/test-kafka + method: DELETE + response: + body: '{"msg":"Record not found","detail":"Couldn''t find syslog ''{ deleted =\u003e + 0000-00-00 00:00:00, name =\u003e test-kafka, service =\u003e 7i6HN3TK9wS159v2gPAZ8A, + version =\u003e 120 }''"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:46 GMT + Fastly-Ratelimit-Remaining: + - "931" + Fastly-Ratelimit-Reset: + - "1588939200" + Status: + - 404 Not Found + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9036-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937386.262838,VS0,VE238 + status: 404 Not Found + code: 404 + duration: "" +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/120/logging/kafka/new-test-kafka + method: DELETE + response: + body: '{"msg":"Record not found","detail":"Couldn''t find syslog ''{ deleted =\u003e + 0000-00-00 00:00:00, name =\u003e new-test-kafka, service =\u003e 7i6HN3TK9wS159v2gPAZ8A, + version =\u003e 120 }''"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:46 GMT + Fastly-Ratelimit-Remaining: + - "930" + Fastly-Ratelimit-Reset: + - "1588939200" + Status: + - 404 Not Found + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9035-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937387.515604,VS0,VE188 + status: 404 Not Found + code: 404 + duration: "" diff --git a/fastly/fixtures/kafkas/create.yaml b/fastly/fixtures/kafkas/create.yaml new file mode 100644 index 000000000..a10a9c9da --- /dev/null +++ b/fastly/fixtures/kafkas/create.yaml @@ -0,0 +1,180 @@ +--- +version: 1 +interactions: +- request: + body: Service=7i6HN3TK9wS159v2gPAZ8A&Version=120&brokers=192.168.1.1%2C192.168.1.2&compression_codec=lz4&format=%25h+%25l+%25u+%25t+%22%25r%22+%25%3Es+%25b&format_version=2&name=test-kafka&placement=waf_debug&required_acks=-1&tls_ca_cert=-----BEGIN+CERTIFICATE-----%0AMIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL%0AMAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC%0AVU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx%0ANDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD%0ATjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu%0AZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE%2FB7j%0AV14qeyslnr26xZUsSVko36ZnhiaO%2FzbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj%0AgbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA%0AFFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE%0ACBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS%0ABgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE%0ABQADQQA%2FugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z%2F%2BHQX67aRfgZu7KWdI%2BJu%0AWm7DCfrPNGVwFWUQOmsPue9rZBgO%0A-----END+CERTIFICATE-----&tls_client_cert=-----BEGIN+CERTIFICATE-----%0AMIIE6DCCAtACCQCzHO2a8qU6KzANBgkqhkiG9w0BAQsFADA2MRIwEAYDVQQDDAls%0Ab2NhbGhvc3QxIDAeBgNVBAoMF0NsaWVudCBDZXJ0aWZpY2F0ZSBEZW1vMB4XDTE5%0AMTIwNTE3MjY1N1oXDTIwMTIwNDE3MjY1N1owNjESMBAGA1UEAwwJbG9jYWxob3N0%0AMSAwHgYDVQQKDBdDbGllbnQgQ2VydGlmaWNhdGUgRGVtbzCCAiIwDQYJKoZIhvcN%0AAQEBBQADggIPADCCAgoCggIBAJ3iM9y8yWa9P%2BMRVj9Jj%2BrpNGDDrS1z2kl7SgDB%0AZisFYCHccvLfnz10OCWkI4fUWeAbsg2QJZ8i1EdFDtWnqhPXyqUsHRZRAI92ujvf%0A4g9r7ID0MENfVKOIY7ye3aphHUEW5lAkkJae12QcxyjTbrbfE0kQXpBHYaqFPRZs%0ACTXZOOZfSuEVxcrRJMjlt1J8thnGGmaa3yH6o1yt6hQdTp9JNzzeUwWe78PaAms8%0ARaLcaDXC7fsgByI8j9coKOluQdinYxkBLAHMpo7x6QuOYA3oguZXAUpMXJMJCQD2%0ANd0WL33Dy4XHcPrhw%2BlfCVW7E1sbWO3Ka1ZVeu0FEF0erOKAmfQk2eoMJzR9qKwm%0AkbM2rYq5qrN19a5Rdtxxov4zOuOyvI6b1Uz5PajN1dyXzuKImOXFmiEL7ykC8kxD%0Au8HA90pC2VK3V0mx6tsR%2FH6zMBIg2je51nJ%2F11VCmIgS5%2F%2Bjso1h%2BoUtqHAsWi1%2F%0A5u8lrQzMC3CR3VKLGCWhfF7NpQ82DYLnBh60t%2FE4mY0WX7GDAY8QTMKd4dnmKU6d%0AnKYDzXZR1he1c08%2B6NX%2BpdzJxih8Q%2FEG0PkNNla0MabMDsi7eFMUCjSPOUG99vGW%0APNvMqP%2FEvCmCW7VKmph4NSNHjwkxTTOQD%2FZGX9IpQWZkCxyCIMxAi1hCgu0zKR%2B%2B%0AU%2B7BAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAC8av9I4ezwlmM7ysaJvC1IfCzNN%0AVawIK1U7bfj9Oyjl49Bn%2FyTwbbiQ8j5VjOza4umIwnYp1HP6%2FmlBO%2Bey8WFYPmDM%0AJAspk6sYEQW7MrbZ9QOmq24YAkwMzgK1hDASCKq4GJCzGDym3Zx6fvPnMCPdei2c%0AjgtjzzBmyewE0zcegOHDrFXTaUIfoSbduTbV9zClJ%2FpJDkTklRX1cYBtIox77gpZ%0A1cnIC803gi1rVCHRNdq85ltOTjoF1%2FwVamLy5c6CYlp5IPyVOm0nqbqra47QIwss%0AQSGxn5l52BC1jP1l3eK1mEr64%2BdbMhqX3ZQwhfuiQ9VmdovNN1NarPWfmQia6Spq%0ATfxN%2B3VhloKFUh%2BfgwNzWYLKCMnwBuPVhVGcpclvrj50MsyeiT2IfE8pqWw26g6g%0A0xu85AbqYKePaZ7wPoDddbwCIGr6BBT87Nsu%2BAqtnkH3uw34FDDcjWR1CmNuI1mP%0Aac6d1jdfbkL5ZUJTpTJi0BxWbTGupv8VzufteFRNa7U2h1O6%2BkyPmEpA3heEZcEO%0AHq5zIfW6QTUmBXDfMFzQ9h0764oBVwm29bjZ59bU3RhcAZtL8fi5BapNtoKAy55d%0AP%2F0WahbwNjP68QYVLBeK9Sfo0XxLU0hJP4RJUZSXy9kUuZ8xhAM%2F6PdE04cDq71v%0AZfq6%2FHA3phy85qyj%0A-----END+CERTIFICATE-----&tls_client_key=-----BEGIN+PRIVATE+KEY-----%0AMIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCd4jPcvMlmvT%2Fj%0AEVY%2FSY%2Fq6TRgw60tc9pJe0oAwWYrBWAh3HLy3589dDglpCOH1FngG7INkCWfItRH%0ARQ7Vp6oT18qlLB0WUQCPdro73%2BIPa%2ByA9DBDX1SjiGO8nt2qYR1BFuZQJJCWntdk%0AHMco02623xNJEF6QR2GqhT0WbAk12TjmX0rhFcXK0STI5bdSfLYZxhpmmt8h%2BqNc%0AreoUHU6fSTc83lMFnu%2FD2gJrPEWi3Gg1wu37IAciPI%2FXKCjpbkHYp2MZASwBzKaO%0A8ekLjmAN6ILmVwFKTFyTCQkA9jXdFi99w8uFx3D64cPpXwlVuxNbG1jtymtWVXrt%0ABRBdHqzigJn0JNnqDCc0faisJpGzNq2KuaqzdfWuUXbccaL%2BMzrjsryOm9VM%2BT2o%0AzdXcl87iiJjlxZohC%2B8pAvJMQ7vBwPdKQtlSt1dJserbEfx%2BszASINo3udZyf9dV%0AQpiIEuf%2Fo7KNYfqFLahwLFotf%2BbvJa0MzAtwkd1SixgloXxezaUPNg2C5wYetLfx%0AOJmNFl%2BxgwGPEEzCneHZ5ilOnZymA812UdYXtXNPPujV%2FqXcycYofEPxBtD5DTZW%0AtDGmzA7Iu3hTFAo0jzlBvfbxljzbzKj%2FxLwpglu1SpqYeDUjR48JMU0zkA%2F2Rl%2FS%0AKUFmZAscgiDMQItYQoLtMykfvlPuwQIDAQABAoICAF0M8SX6efS8Owf3ss4v68s2%0AUHFrQgiUzCUcrZvOYAmg7GxogbLUywQsF99PYsVuCN5FVGYb%2B6BTpaqvb7PKUjnJ%0Ap5w7aJU7fkoPXmllZNVT9Rp3UG6Uo8yR2L5VHy2IePZgqbK4KiMrUKSnNVXBbvIG%0AfVZFeIYuG8ilKECrwa3j7V4Q8Y%2FBBkanhreEc8wAxk5gbDTmt%2FVNw7Qep%2BPc9fZ4%0A7z5HhcS9THAwb9aFukDnB%2BAPl7S2xp2N9fSHrb0OB27KEGSvRSF2XP%2FIYWI3MjNg%0AQq3Av3jrkm%2FyFkVj1pELv0eu%2BqdIyTSDlLRZF6ZYUGsUrg%2FPif1i%2BcTxhBhtuNQE%0AlitIfxBiMf3Hyx8GTXWJACKFQY3r2zzDu2Nx7dprzcss3aJhHOtRie%2FBYLe4i5fP%0A88VYuEwKWo1LJVBq4GyZcvhehHxVlJTb3SdfnsicSUzEhuTZl%2F2lhswSZQfhJ34C%0AbFHSgR3QHwpbUJSm5qJ%2F4Uz6MqPyPD5bQKdKzuFpRaMQ3x%2F%2BS28hXtzzvD%2FalGrV%0AcNKEC6Bq8q1Vy%2F4KDqyhq17FVh29FbU%2FTzJSAPzEW8usfydCLox9namPMjOMz5LW%0AgYKR8FHABwyWsDDOTsWQtfZ7Gpjb%2B3RdPyZ%2FiTRME%2FBlu0wvuGgC2YSy315z%2F9I0%0AAE0C3gIjqFoGk3cP4A7VAoIBAQDMf%2B0potwuNQeZRZuTATyxn5qawwZ7b58rHwPw%0ANMtO%2FFNU8Vkc4%2FvXi5guRBCbB%2Fu3nNBieulp3EJ217NfE3AGhe9zvY%2BZT63YcVv2%0AgT6BiBZZ%2ByzPsNbT3vhnOuSOZA7m%2Bz8JzM5QhDR0LRYwnlIFf948GiAg4SAYG2%2BN%0AQWKtZqg559QfW41APBmw9RtZ0hPFBv6pQsvF0t1INc7oVbwX5xNwaKdzMvG2za9d%0AcKpXQrJtpaTF12x59RnmhzML1gzpZ1LWVSSXt1fgMxdzWRa%2FIcV%2BTLdF3%2BikL7st%0ALcrqCZ4INeJalcXSA6mOV61yOwxAzrw1dkZ9qZV0YaW0DzM7AoIBAQDFpPDcHW6I%0APTB3SXFYudCpbh%2FOLXBndSkk80YZ71VJIb8KtWN2KKZbGqnWOeJ17M3Hh5B0xjNT%0Ay5L%2BAXsL%2B0G8deOtWORDPSpWm6Q7OJmJY67vVh9U7dA70VPUGdqljy4a1fAwzZNU%0AmI4gpqwWjCl3c%2F6c%2FR4QY85YgkdAgoLPIc0LJr58MTx8zT4oaY8IXf4Sa2xO5kAa%0Ark4CoDHZw97N6LP8v4fEMZiqQZ8Mqa0UbX8ORlyF3aKGh0QaAAn9j7aJpEwgcjWh%0AaBnGI2b7JTofqJIsSbvvFOnNHt1hnkncm7fVXRvcgguHeJ1pVGiSs5h6aMvJ7IiW%0AmnXBrBzgho4zAoIBAQDC0gC70MaYUrbpgxHia6RJx7Z%2FR9rOD5oAd6zF01X46pPs%0A8Xym9F9BimCxevCi8WkSFJfFqjjiPA8prvbYVek8na5wgh%2Fiu7Dv6Zbl8Vz%2BBArf%0AMFYRivQuplXZ6pZBPPuhe6wjhvTqafia0TU5niqfyKCMe4suJ6rurHyKgsciURFl%0AEQHZ2dtoXZlQJ0ImQOfKpY5I7DS7QtbC61gxqTPnRaIUTe9w5RC3yZ4Ok74EIatg%0AoBSo0kEqsqE5KIYt%2BX8VgPS%2B8iBJVUandaUao73y2paOa0GSlOzKNhrIwL52VjEy%0Auzrod5UdLZYD4G2BzNUwjINrH0Gqh7u1Qy2cq3pvAoIBACbXDhpDkmglljOq9CJa%0Aib3yDUAIP%2FGk3YwMXrdUCC%2BR%2BSgSk1QyEtcOe1fFElLYUWwnoOTB2m5aMC3IfrTR%0AEI8Hn9F%2BCYWJLJvOhEy7B7kvJL6V7xxSi7xlm5Kv7f7hD09owYXlsFFMlYmnF2Rq%0A8O8vlVami1TvOCq%2Bl1%2F%2FBdPMsa3CVGa1ikyATPnGHLypM%2FfMsoEi0HAt1ti%2FQGyq%0ACEvwsgY2YWjV0kmLEcV8Rq4gAnr8qswHzRug02pEnbH9nwKXjfpGV3G7smz0ohUy%0AsKRuDSO07cDDHFsZ%2BKlpYNyAoXTFkmcYC0n5Ev4S%2F2Xs80cC9yFcYU8vVXrU5uvc%0ApW8CggEBAKblNJAibR6wAUHNzHOGs3EDZB%2Bw7h%2B1aFlDyAXJkBVspP5m62AmHEaN%0AJa00jDulaNq1Xp3bQI0DnNtoly0ihjskawSgKXsKI%2BE79eK7kPeYEZ4qN26v6rDg%0AKCMF8357GjjP7QpI79GwhDyXUwFns3W5stgHaBprhjBAQKQNuqCjrYHpem4EZlNT%0A5fwhCP%2FG9BcvHw4cT%2Fvt%2BjG24W5JFGnLNxtsdJIPsqQJQymIqISEdQgGk5%2Fppgla%0AVtFHIUtevjK72l8AAO0VRwrtAriILixPuTKM1nFj%2FlCG5hbFN%2B%2Fxm1CXLyVCumkV%0AImXgKS5UmJB53s9yiomen%2Fn7cUXvrAk%3D%0A-----END+PRIVATE+KEY-----&tls_hostname=example.com&topic=kafka-topic&use_tls=1 + form: + Service: + - 7i6HN3TK9wS159v2gPAZ8A + Version: + - "120" + brokers: + - 192.168.1.1,192.168.1.2 + compression_codec: + - lz4 + format: + - '%h %l %u %t "%r" %>s %b' + format_version: + - "2" + name: + - test-kafka + placement: + - waf_debug + required_acks: + - "-1" + tls_ca_cert: + - |- + -----BEGIN CERTIFICATE----- + MIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL + MAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC + VU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx + NDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD + TjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu + ZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j + V14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj + gbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA + FFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE + CBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS + BgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE + BQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju + Wm7DCfrPNGVwFWUQOmsPue9rZBgO + -----END CERTIFICATE----- + tls_client_cert: + - |- + -----BEGIN CERTIFICATE----- + MIIE6DCCAtACCQCzHO2a8qU6KzANBgkqhkiG9w0BAQsFADA2MRIwEAYDVQQDDAls + b2NhbGhvc3QxIDAeBgNVBAoMF0NsaWVudCBDZXJ0aWZpY2F0ZSBEZW1vMB4XDTE5 + MTIwNTE3MjY1N1oXDTIwMTIwNDE3MjY1N1owNjESMBAGA1UEAwwJbG9jYWxob3N0 + MSAwHgYDVQQKDBdDbGllbnQgQ2VydGlmaWNhdGUgRGVtbzCCAiIwDQYJKoZIhvcN + AQEBBQADggIPADCCAgoCggIBAJ3iM9y8yWa9P+MRVj9Jj+rpNGDDrS1z2kl7SgDB + ZisFYCHccvLfnz10OCWkI4fUWeAbsg2QJZ8i1EdFDtWnqhPXyqUsHRZRAI92ujvf + 4g9r7ID0MENfVKOIY7ye3aphHUEW5lAkkJae12QcxyjTbrbfE0kQXpBHYaqFPRZs + CTXZOOZfSuEVxcrRJMjlt1J8thnGGmaa3yH6o1yt6hQdTp9JNzzeUwWe78PaAms8 + RaLcaDXC7fsgByI8j9coKOluQdinYxkBLAHMpo7x6QuOYA3oguZXAUpMXJMJCQD2 + Nd0WL33Dy4XHcPrhw+lfCVW7E1sbWO3Ka1ZVeu0FEF0erOKAmfQk2eoMJzR9qKwm + kbM2rYq5qrN19a5Rdtxxov4zOuOyvI6b1Uz5PajN1dyXzuKImOXFmiEL7ykC8kxD + u8HA90pC2VK3V0mx6tsR/H6zMBIg2je51nJ/11VCmIgS5/+jso1h+oUtqHAsWi1/ + 5u8lrQzMC3CR3VKLGCWhfF7NpQ82DYLnBh60t/E4mY0WX7GDAY8QTMKd4dnmKU6d + nKYDzXZR1he1c08+6NX+pdzJxih8Q/EG0PkNNla0MabMDsi7eFMUCjSPOUG99vGW + PNvMqP/EvCmCW7VKmph4NSNHjwkxTTOQD/ZGX9IpQWZkCxyCIMxAi1hCgu0zKR++ + U+7BAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAC8av9I4ezwlmM7ysaJvC1IfCzNN + VawIK1U7bfj9Oyjl49Bn/yTwbbiQ8j5VjOza4umIwnYp1HP6/mlBO+ey8WFYPmDM + JAspk6sYEQW7MrbZ9QOmq24YAkwMzgK1hDASCKq4GJCzGDym3Zx6fvPnMCPdei2c + jgtjzzBmyewE0zcegOHDrFXTaUIfoSbduTbV9zClJ/pJDkTklRX1cYBtIox77gpZ + 1cnIC803gi1rVCHRNdq85ltOTjoF1/wVamLy5c6CYlp5IPyVOm0nqbqra47QIwss + QSGxn5l52BC1jP1l3eK1mEr64+dbMhqX3ZQwhfuiQ9VmdovNN1NarPWfmQia6Spq + TfxN+3VhloKFUh+fgwNzWYLKCMnwBuPVhVGcpclvrj50MsyeiT2IfE8pqWw26g6g + 0xu85AbqYKePaZ7wPoDddbwCIGr6BBT87Nsu+AqtnkH3uw34FDDcjWR1CmNuI1mP + ac6d1jdfbkL5ZUJTpTJi0BxWbTGupv8VzufteFRNa7U2h1O6+kyPmEpA3heEZcEO + Hq5zIfW6QTUmBXDfMFzQ9h0764oBVwm29bjZ59bU3RhcAZtL8fi5BapNtoKAy55d + P/0WahbwNjP68QYVLBeK9Sfo0XxLU0hJP4RJUZSXy9kUuZ8xhAM/6PdE04cDq71v + Zfq6/HA3phy85qyj + -----END CERTIFICATE----- + tls_client_key: + - |- + -----BEGIN PRIVATE KEY----- + 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 + ImXgKS5UmJB53s9yiomen/n7cUXvrAk= + -----END PRIVATE KEY----- + tls_hostname: + - example.com + topic: + - kafka-topic + use_tls: + - "1" + headers: + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/120/logging/kafka + method: POST + response: + body: '{"brokers":"192.168.1.1,192.168.1.2","compression_codec":"lz4","format":"%h + %l %u %t \"%r\" %\u003es %b","format_version":2,"name":"test-kafka","placement":"waf_debug","required_acks":"-1","tls_ca_cert":"-----BEGIN + CERTIFICATE-----\nMIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL\nMAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC\nVU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx\nNDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD\nTjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu\nZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j\nV14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj\ngbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA\nFFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE\nCBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS\nBgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE\nBQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju\nWm7DCfrPNGVwFWUQOmsPue9rZBgO\n-----END + CERTIFICATE-----","tls_client_cert":"-----BEGIN CERTIFICATE-----\nMIIE6DCCAtACCQCzHO2a8qU6KzANBgkqhkiG9w0BAQsFADA2MRIwEAYDVQQDDAls\nb2NhbGhvc3QxIDAeBgNVBAoMF0NsaWVudCBDZXJ0aWZpY2F0ZSBEZW1vMB4XDTE5\nMTIwNTE3MjY1N1oXDTIwMTIwNDE3MjY1N1owNjESMBAGA1UEAwwJbG9jYWxob3N0\nMSAwHgYDVQQKDBdDbGllbnQgQ2VydGlmaWNhdGUgRGVtbzCCAiIwDQYJKoZIhvcN\nAQEBBQADggIPADCCAgoCggIBAJ3iM9y8yWa9P+MRVj9Jj+rpNGDDrS1z2kl7SgDB\nZisFYCHccvLfnz10OCWkI4fUWeAbsg2QJZ8i1EdFDtWnqhPXyqUsHRZRAI92ujvf\n4g9r7ID0MENfVKOIY7ye3aphHUEW5lAkkJae12QcxyjTbrbfE0kQXpBHYaqFPRZs\nCTXZOOZfSuEVxcrRJMjlt1J8thnGGmaa3yH6o1yt6hQdTp9JNzzeUwWe78PaAms8\nRaLcaDXC7fsgByI8j9coKOluQdinYxkBLAHMpo7x6QuOYA3oguZXAUpMXJMJCQD2\nNd0WL33Dy4XHcPrhw+lfCVW7E1sbWO3Ka1ZVeu0FEF0erOKAmfQk2eoMJzR9qKwm\nkbM2rYq5qrN19a5Rdtxxov4zOuOyvI6b1Uz5PajN1dyXzuKImOXFmiEL7ykC8kxD\nu8HA90pC2VK3V0mx6tsR/H6zMBIg2je51nJ/11VCmIgS5/+jso1h+oUtqHAsWi1/\n5u8lrQzMC3CR3VKLGCWhfF7NpQ82DYLnBh60t/E4mY0WX7GDAY8QTMKd4dnmKU6d\nnKYDzXZR1he1c08+6NX+pdzJxih8Q/EG0PkNNla0MabMDsi7eFMUCjSPOUG99vGW\nPNvMqP/EvCmCW7VKmph4NSNHjwkxTTOQD/ZGX9IpQWZkCxyCIMxAi1hCgu0zKR++\nU+7BAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAC8av9I4ezwlmM7ysaJvC1IfCzNN\nVawIK1U7bfj9Oyjl49Bn/yTwbbiQ8j5VjOza4umIwnYp1HP6/mlBO+ey8WFYPmDM\nJAspk6sYEQW7MrbZ9QOmq24YAkwMzgK1hDASCKq4GJCzGDym3Zx6fvPnMCPdei2c\njgtjzzBmyewE0zcegOHDrFXTaUIfoSbduTbV9zClJ/pJDkTklRX1cYBtIox77gpZ\n1cnIC803gi1rVCHRNdq85ltOTjoF1/wVamLy5c6CYlp5IPyVOm0nqbqra47QIwss\nQSGxn5l52BC1jP1l3eK1mEr64+dbMhqX3ZQwhfuiQ9VmdovNN1NarPWfmQia6Spq\nTfxN+3VhloKFUh+fgwNzWYLKCMnwBuPVhVGcpclvrj50MsyeiT2IfE8pqWw26g6g\n0xu85AbqYKePaZ7wPoDddbwCIGr6BBT87Nsu+AqtnkH3uw34FDDcjWR1CmNuI1mP\nac6d1jdfbkL5ZUJTpTJi0BxWbTGupv8VzufteFRNa7U2h1O6+kyPmEpA3heEZcEO\nHq5zIfW6QTUmBXDfMFzQ9h0764oBVwm29bjZ59bU3RhcAZtL8fi5BapNtoKAy55d\nP/0WahbwNjP68QYVLBeK9Sfo0XxLU0hJP4RJUZSXy9kUuZ8xhAM/6PdE04cDq71v\nZfq6/HA3phy85qyj\n-----END + CERTIFICATE-----","tls_client_key":"-----BEGIN PRIVATE KEY-----\n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\nImXgKS5UmJB53s9yiomen/n7cUXvrAk=\n-----END + PRIVATE KEY-----","tls_hostname":"example.com","topic":"kafka-topic","use_tls":"1","service_id":"7i6HN3TK9wS159v2gPAZ8A","version":"120","updated_at":"2020-05-08T11:29:44Z","deleted_at":null,"response_condition":"","created_at":"2020-05-08T11:29:44Z"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:44 GMT + Fastly-Ratelimit-Remaining: + - "934" + Fastly-Ratelimit-Reset: + - "1588939200" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9036-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937384.299224,VS0,VE550 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/kafkas/delete.yaml b/fastly/fixtures/kafkas/delete.yaml new file mode 100644 index 000000000..70aac2f6d --- /dev/null +++ b/fastly/fixtures/kafkas/delete.yaml @@ -0,0 +1,47 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/120/logging/kafka/new-test-kafka + method: DELETE + response: + body: '{"status":"ok"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:46 GMT + Fastly-Ratelimit-Remaining: + - "932" + Fastly-Ratelimit-Reset: + - "1588939200" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9035-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937386.899148,VS0,VE346 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/kafkas/get.yaml b/fastly/fixtures/kafkas/get.yaml new file mode 100644 index 000000000..c51799d9d --- /dev/null +++ b/fastly/fixtures/kafkas/get.yaml @@ -0,0 +1,53 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/120/logging/kafka/test-kafka + method: GET + response: + body: '{"format":"%h %l %u %t \"%r\" %\u003es %b","tls_client_cert":"-----BEGIN + CERTIFICATE-----\nMIIE6DCCAtACCQCzHO2a8qU6KzANBgkqhkiG9w0BAQsFADA2MRIwEAYDVQQDDAls\nb2NhbGhvc3QxIDAeBgNVBAoMF0NsaWVudCBDZXJ0aWZpY2F0ZSBEZW1vMB4XDTE5\nMTIwNTE3MjY1N1oXDTIwMTIwNDE3MjY1N1owNjESMBAGA1UEAwwJbG9jYWxob3N0\nMSAwHgYDVQQKDBdDbGllbnQgQ2VydGlmaWNhdGUgRGVtbzCCAiIwDQYJKoZIhvcN\nAQEBBQADggIPADCCAgoCggIBAJ3iM9y8yWa9P+MRVj9Jj+rpNGDDrS1z2kl7SgDB\nZisFYCHccvLfnz10OCWkI4fUWeAbsg2QJZ8i1EdFDtWnqhPXyqUsHRZRAI92ujvf\n4g9r7ID0MENfVKOIY7ye3aphHUEW5lAkkJae12QcxyjTbrbfE0kQXpBHYaqFPRZs\nCTXZOOZfSuEVxcrRJMjlt1J8thnGGmaa3yH6o1yt6hQdTp9JNzzeUwWe78PaAms8\nRaLcaDXC7fsgByI8j9coKOluQdinYxkBLAHMpo7x6QuOYA3oguZXAUpMXJMJCQD2\nNd0WL33Dy4XHcPrhw+lfCVW7E1sbWO3Ka1ZVeu0FEF0erOKAmfQk2eoMJzR9qKwm\nkbM2rYq5qrN19a5Rdtxxov4zOuOyvI6b1Uz5PajN1dyXzuKImOXFmiEL7ykC8kxD\nu8HA90pC2VK3V0mx6tsR/H6zMBIg2je51nJ/11VCmIgS5/+jso1h+oUtqHAsWi1/\n5u8lrQzMC3CR3VKLGCWhfF7NpQ82DYLnBh60t/E4mY0WX7GDAY8QTMKd4dnmKU6d\nnKYDzXZR1he1c08+6NX+pdzJxih8Q/EG0PkNNla0MabMDsi7eFMUCjSPOUG99vGW\nPNvMqP/EvCmCW7VKmph4NSNHjwkxTTOQD/ZGX9IpQWZkCxyCIMxAi1hCgu0zKR++\nU+7BAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAC8av9I4ezwlmM7ysaJvC1IfCzNN\nVawIK1U7bfj9Oyjl49Bn/yTwbbiQ8j5VjOza4umIwnYp1HP6/mlBO+ey8WFYPmDM\nJAspk6sYEQW7MrbZ9QOmq24YAkwMzgK1hDASCKq4GJCzGDym3Zx6fvPnMCPdei2c\njgtjzzBmyewE0zcegOHDrFXTaUIfoSbduTbV9zClJ/pJDkTklRX1cYBtIox77gpZ\n1cnIC803gi1rVCHRNdq85ltOTjoF1/wVamLy5c6CYlp5IPyVOm0nqbqra47QIwss\nQSGxn5l52BC1jP1l3eK1mEr64+dbMhqX3ZQwhfuiQ9VmdovNN1NarPWfmQia6Spq\nTfxN+3VhloKFUh+fgwNzWYLKCMnwBuPVhVGcpclvrj50MsyeiT2IfE8pqWw26g6g\n0xu85AbqYKePaZ7wPoDddbwCIGr6BBT87Nsu+AqtnkH3uw34FDDcjWR1CmNuI1mP\nac6d1jdfbkL5ZUJTpTJi0BxWbTGupv8VzufteFRNa7U2h1O6+kyPmEpA3heEZcEO\nHq5zIfW6QTUmBXDfMFzQ9h0764oBVwm29bjZ59bU3RhcAZtL8fi5BapNtoKAy55d\nP/0WahbwNjP68QYVLBeK9Sfo0XxLU0hJP4RJUZSXy9kUuZ8xhAM/6PdE04cDq71v\nZfq6/HA3phy85qyj\n-----END + CERTIFICATE-----","tls_hostname":"example.com","version":"120","use_tls":"1","tls_client_key":"-----BEGIN + PRIVATE KEY-----\n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\nImXgKS5UmJB53s9yiomen/n7cUXvrAk=\n-----END + PRIVATE KEY-----","created_at":"2020-05-08T11:29:44Z","placement":"waf_debug","topic":"kafka-topic","service_id":"7i6HN3TK9wS159v2gPAZ8A","compression_codec":"lz4","tls_ca_cert":"-----BEGIN + CERTIFICATE-----\nMIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL\nMAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC\nVU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx\nNDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD\nTjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu\nZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j\nV14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj\ngbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA\nFFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE\nCBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS\nBgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE\nBQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju\nWm7DCfrPNGVwFWUQOmsPue9rZBgO\n-----END + CERTIFICATE-----","response_condition":"","updated_at":"2020-05-08T11:29:44Z","brokers":"192.168.1.1,192.168.1.2","format_version":"2","required_acks":"-1","deleted_at":null,"name":"test-kafka"}' + headers: + Accept-Ranges: + - bytes + - bytes + - bytes + Age: + - "0" + - "0" + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:45 GMT + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9037-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937385.053910,VS0,VE176 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/kafkas/list.yaml b/fastly/fixtures/kafkas/list.yaml new file mode 100644 index 000000000..cff45a131 --- /dev/null +++ b/fastly/fixtures/kafkas/list.yaml @@ -0,0 +1,53 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/120/logging/kafka + method: GET + response: + body: '[{"required_acks":"-1","version":"120","response_condition":"","tls_hostname":"example.com","use_tls":"1","deleted_at":null,"updated_at":"2020-05-08T11:29:44Z","name":"test-kafka","topic":"kafka-topic","tls_client_cert":"-----BEGIN + CERTIFICATE-----\nMIIE6DCCAtACCQCzHO2a8qU6KzANBgkqhkiG9w0BAQsFADA2MRIwEAYDVQQDDAls\nb2NhbGhvc3QxIDAeBgNVBAoMF0NsaWVudCBDZXJ0aWZpY2F0ZSBEZW1vMB4XDTE5\nMTIwNTE3MjY1N1oXDTIwMTIwNDE3MjY1N1owNjESMBAGA1UEAwwJbG9jYWxob3N0\nMSAwHgYDVQQKDBdDbGllbnQgQ2VydGlmaWNhdGUgRGVtbzCCAiIwDQYJKoZIhvcN\nAQEBBQADggIPADCCAgoCggIBAJ3iM9y8yWa9P+MRVj9Jj+rpNGDDrS1z2kl7SgDB\nZisFYCHccvLfnz10OCWkI4fUWeAbsg2QJZ8i1EdFDtWnqhPXyqUsHRZRAI92ujvf\n4g9r7ID0MENfVKOIY7ye3aphHUEW5lAkkJae12QcxyjTbrbfE0kQXpBHYaqFPRZs\nCTXZOOZfSuEVxcrRJMjlt1J8thnGGmaa3yH6o1yt6hQdTp9JNzzeUwWe78PaAms8\nRaLcaDXC7fsgByI8j9coKOluQdinYxkBLAHMpo7x6QuOYA3oguZXAUpMXJMJCQD2\nNd0WL33Dy4XHcPrhw+lfCVW7E1sbWO3Ka1ZVeu0FEF0erOKAmfQk2eoMJzR9qKwm\nkbM2rYq5qrN19a5Rdtxxov4zOuOyvI6b1Uz5PajN1dyXzuKImOXFmiEL7ykC8kxD\nu8HA90pC2VK3V0mx6tsR/H6zMBIg2je51nJ/11VCmIgS5/+jso1h+oUtqHAsWi1/\n5u8lrQzMC3CR3VKLGCWhfF7NpQ82DYLnBh60t/E4mY0WX7GDAY8QTMKd4dnmKU6d\nnKYDzXZR1he1c08+6NX+pdzJxih8Q/EG0PkNNla0MabMDsi7eFMUCjSPOUG99vGW\nPNvMqP/EvCmCW7VKmph4NSNHjwkxTTOQD/ZGX9IpQWZkCxyCIMxAi1hCgu0zKR++\nU+7BAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAC8av9I4ezwlmM7ysaJvC1IfCzNN\nVawIK1U7bfj9Oyjl49Bn/yTwbbiQ8j5VjOza4umIwnYp1HP6/mlBO+ey8WFYPmDM\nJAspk6sYEQW7MrbZ9QOmq24YAkwMzgK1hDASCKq4GJCzGDym3Zx6fvPnMCPdei2c\njgtjzzBmyewE0zcegOHDrFXTaUIfoSbduTbV9zClJ/pJDkTklRX1cYBtIox77gpZ\n1cnIC803gi1rVCHRNdq85ltOTjoF1/wVamLy5c6CYlp5IPyVOm0nqbqra47QIwss\nQSGxn5l52BC1jP1l3eK1mEr64+dbMhqX3ZQwhfuiQ9VmdovNN1NarPWfmQia6Spq\nTfxN+3VhloKFUh+fgwNzWYLKCMnwBuPVhVGcpclvrj50MsyeiT2IfE8pqWw26g6g\n0xu85AbqYKePaZ7wPoDddbwCIGr6BBT87Nsu+AqtnkH3uw34FDDcjWR1CmNuI1mP\nac6d1jdfbkL5ZUJTpTJi0BxWbTGupv8VzufteFRNa7U2h1O6+kyPmEpA3heEZcEO\nHq5zIfW6QTUmBXDfMFzQ9h0764oBVwm29bjZ59bU3RhcAZtL8fi5BapNtoKAy55d\nP/0WahbwNjP68QYVLBeK9Sfo0XxLU0hJP4RJUZSXy9kUuZ8xhAM/6PdE04cDq71v\nZfq6/HA3phy85qyj\n-----END + CERTIFICATE-----","service_id":"7i6HN3TK9wS159v2gPAZ8A","compression_codec":"lz4","tls_ca_cert":"-----BEGIN + CERTIFICATE-----\nMIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL\nMAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC\nVU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx\nNDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD\nTjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu\nZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j\nV14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj\ngbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA\nFFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE\nCBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS\nBgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE\nBQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju\nWm7DCfrPNGVwFWUQOmsPue9rZBgO\n-----END + CERTIFICATE-----","format_version":"2","tls_client_key":"-----BEGIN PRIVATE + KEY-----\n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\nImXgKS5UmJB53s9yiomen/n7cUXvrAk=\n-----END + PRIVATE KEY-----","format":"%h %l %u %t \"%r\" %\u003es %b","brokers":"192.168.1.1,192.168.1.2","created_at":"2020-05-08T11:29:44Z","placement":"waf_debug"}]' + headers: + Accept-Ranges: + - bytes + - bytes + - bytes + Age: + - "0" + - "0" + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:45 GMT + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9036-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937385.866242,VS0,VE176 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/kafkas/update.yaml b/fastly/fixtures/kafkas/update.yaml new file mode 100644 index 000000000..c481f2f18 --- /dev/null +++ b/fastly/fixtures/kafkas/update.yaml @@ -0,0 +1,65 @@ +--- +version: 1 +interactions: +- request: + body: Name=test-kafka&Service=7i6HN3TK9wS159v2gPAZ8A&Version=120&name=new-test-kafka&topic=new-kafka-topic + form: + Name: + - test-kafka + Service: + - 7i6HN3TK9wS159v2gPAZ8A + Version: + - "120" + name: + - new-test-kafka + topic: + - new-kafka-topic + headers: + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/120/logging/kafka/test-kafka + method: PUT + response: + body: '{"format":"%h %l %u %t \"%r\" %\u003es %b","deleted_at":null,"compression_codec":"lz4","service_id":"7i6HN3TK9wS159v2gPAZ8A","version":"120","format_version":"2","use_tls":"1","response_condition":"","updated_at":"2020-05-08T11:29:44Z","tls_ca_cert":"-----BEGIN + CERTIFICATE-----\nMIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL\nMAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC\nVU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx\nNDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD\nTjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu\nZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j\nV14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj\ngbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA\nFFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE\nCBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS\nBgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE\nBQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju\nWm7DCfrPNGVwFWUQOmsPue9rZBgO\n-----END + CERTIFICATE-----","created_at":"2020-05-08T11:29:44Z","brokers":"192.168.1.1,192.168.1.2","tls_client_cert":"-----BEGIN + CERTIFICATE-----\nMIIE6DCCAtACCQCzHO2a8qU6KzANBgkqhkiG9w0BAQsFADA2MRIwEAYDVQQDDAls\nb2NhbGhvc3QxIDAeBgNVBAoMF0NsaWVudCBDZXJ0aWZpY2F0ZSBEZW1vMB4XDTE5\nMTIwNTE3MjY1N1oXDTIwMTIwNDE3MjY1N1owNjESMBAGA1UEAwwJbG9jYWxob3N0\nMSAwHgYDVQQKDBdDbGllbnQgQ2VydGlmaWNhdGUgRGVtbzCCAiIwDQYJKoZIhvcN\nAQEBBQADggIPADCCAgoCggIBAJ3iM9y8yWa9P+MRVj9Jj+rpNGDDrS1z2kl7SgDB\nZisFYCHccvLfnz10OCWkI4fUWeAbsg2QJZ8i1EdFDtWnqhPXyqUsHRZRAI92ujvf\n4g9r7ID0MENfVKOIY7ye3aphHUEW5lAkkJae12QcxyjTbrbfE0kQXpBHYaqFPRZs\nCTXZOOZfSuEVxcrRJMjlt1J8thnGGmaa3yH6o1yt6hQdTp9JNzzeUwWe78PaAms8\nRaLcaDXC7fsgByI8j9coKOluQdinYxkBLAHMpo7x6QuOYA3oguZXAUpMXJMJCQD2\nNd0WL33Dy4XHcPrhw+lfCVW7E1sbWO3Ka1ZVeu0FEF0erOKAmfQk2eoMJzR9qKwm\nkbM2rYq5qrN19a5Rdtxxov4zOuOyvI6b1Uz5PajN1dyXzuKImOXFmiEL7ykC8kxD\nu8HA90pC2VK3V0mx6tsR/H6zMBIg2je51nJ/11VCmIgS5/+jso1h+oUtqHAsWi1/\n5u8lrQzMC3CR3VKLGCWhfF7NpQ82DYLnBh60t/E4mY0WX7GDAY8QTMKd4dnmKU6d\nnKYDzXZR1he1c08+6NX+pdzJxih8Q/EG0PkNNla0MabMDsi7eFMUCjSPOUG99vGW\nPNvMqP/EvCmCW7VKmph4NSNHjwkxTTOQD/ZGX9IpQWZkCxyCIMxAi1hCgu0zKR++\nU+7BAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAC8av9I4ezwlmM7ysaJvC1IfCzNN\nVawIK1U7bfj9Oyjl49Bn/yTwbbiQ8j5VjOza4umIwnYp1HP6/mlBO+ey8WFYPmDM\nJAspk6sYEQW7MrbZ9QOmq24YAkwMzgK1hDASCKq4GJCzGDym3Zx6fvPnMCPdei2c\njgtjzzBmyewE0zcegOHDrFXTaUIfoSbduTbV9zClJ/pJDkTklRX1cYBtIox77gpZ\n1cnIC803gi1rVCHRNdq85ltOTjoF1/wVamLy5c6CYlp5IPyVOm0nqbqra47QIwss\nQSGxn5l52BC1jP1l3eK1mEr64+dbMhqX3ZQwhfuiQ9VmdovNN1NarPWfmQia6Spq\nTfxN+3VhloKFUh+fgwNzWYLKCMnwBuPVhVGcpclvrj50MsyeiT2IfE8pqWw26g6g\n0xu85AbqYKePaZ7wPoDddbwCIGr6BBT87Nsu+AqtnkH3uw34FDDcjWR1CmNuI1mP\nac6d1jdfbkL5ZUJTpTJi0BxWbTGupv8VzufteFRNa7U2h1O6+kyPmEpA3heEZcEO\nHq5zIfW6QTUmBXDfMFzQ9h0764oBVwm29bjZ59bU3RhcAZtL8fi5BapNtoKAy55d\nP/0WahbwNjP68QYVLBeK9Sfo0XxLU0hJP4RJUZSXy9kUuZ8xhAM/6PdE04cDq71v\nZfq6/HA3phy85qyj\n-----END + CERTIFICATE-----","topic":"new-kafka-topic","tls_hostname":"example.com","tls_client_key":"-----BEGIN + PRIVATE KEY-----\nMIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCd4jPcvMlmvT/j\nEVY/SY/q6TRgw60tc9pJe0oAwWYrBWAh3HLy3589dDglpCOH1FngG7INkCWfItRH\nRQ7Vp6oT18qlLB0WUQCPdro73+IPa+yA9DBDX1SjiGO8nt2qYR1BFuZQJJCWntdk\nHMco02623xNJEF6QR2GqhT0WbAk12TjmX0rhFcXK0STI5bdSfLYZxhpmmt8h+qNc\nreoUHU6fSTc83lMFnu/D2gJrPEWi3Gg1wu37IAciPI/XKCjpbkHYp2MZASwBzKaO\n8ekLjmAN6ILmVwFKTFyTCQkA9jXdFi99w8uFx3D64cPpXwlVuxNbG1jtymtWVXrt\nBRBdHqzigJn0JNnqDCc0faisJpGzNq2KuaqzdfWuUXbccaL+MzrjsryOm9VM+T2o\nzdXcl87iiJjlxZohC+8pAvJMQ7vBwPdKQtlSt1dJserbEfx+szASINo3udZyf9dV\nQpiIEuf/o7KNYfqFLahwLFotf+bvJa0MzAtwkd1SixgloXxezaUPNg2C5wYetLfx\nOJmNFl+xgwGPEEzCneHZ5ilOnZymA812UdYXtXNPPujV/qXcycYofEPxBtD5DTZW\ntDGmzA7Iu3hTFAo0jzlBvfbxljzbzKj/xLwpglu1SpqYeDUjR48JMU0zkA/2Rl/S\nKUFmZAscgiDMQItYQoLtMykfvlPuwQIDAQABAoICAF0M8SX6efS8Owf3ss4v68s2\nUHFrQgiUzCUcrZvOYAmg7GxogbLUywQsF99PYsVuCN5FVGYb+6BTpaqvb7PKUjnJ\np5w7aJU7fkoPXmllZNVT9Rp3UG6Uo8yR2L5VHy2IePZgqbK4KiMrUKSnNVXBbvIG\nfVZFeIYuG8ilKECrwa3j7V4Q8Y/BBkanhreEc8wAxk5gbDTmt/VNw7Qep+Pc9fZ4\n7z5HhcS9THAwb9aFukDnB+APl7S2xp2N9fSHrb0OB27KEGSvRSF2XP/IYWI3MjNg\nQq3Av3jrkm/yFkVj1pELv0eu+qdIyTSDlLRZF6ZYUGsUrg/Pif1i+cTxhBhtuNQE\nlitIfxBiMf3Hyx8GTXWJACKFQY3r2zzDu2Nx7dprzcss3aJhHOtRie/BYLe4i5fP\n88VYuEwKWo1LJVBq4GyZcvhehHxVlJTb3SdfnsicSUzEhuTZl/2lhswSZQfhJ34C\nbFHSgR3QHwpbUJSm5qJ/4Uz6MqPyPD5bQKdKzuFpRaMQ3x/+S28hXtzzvD/alGrV\ncNKEC6Bq8q1Vy/4KDqyhq17FVh29FbU/TzJSAPzEW8usfydCLox9namPMjOMz5LW\ngYKR8FHABwyWsDDOTsWQtfZ7Gpjb+3RdPyZ/iTRME/Blu0wvuGgC2YSy315z/9I0\nAE0C3gIjqFoGk3cP4A7VAoIBAQDMf+0potwuNQeZRZuTATyxn5qawwZ7b58rHwPw\nNMtO/FNU8Vkc4/vXi5guRBCbB/u3nNBieulp3EJ217NfE3AGhe9zvY+ZT63YcVv2\ngT6BiBZZ+yzPsNbT3vhnOuSOZA7m+z8JzM5QhDR0LRYwnlIFf948GiAg4SAYG2+N\nQWKtZqg559QfW41APBmw9RtZ0hPFBv6pQsvF0t1INc7oVbwX5xNwaKdzMvG2za9d\ncKpXQrJtpaTF12x59RnmhzML1gzpZ1LWVSSXt1fgMxdzWRa/IcV+TLdF3+ikL7st\nLcrqCZ4INeJalcXSA6mOV61yOwxAzrw1dkZ9qZV0YaW0DzM7AoIBAQDFpPDcHW6I\nPTB3SXFYudCpbh/OLXBndSkk80YZ71VJIb8KtWN2KKZbGqnWOeJ17M3Hh5B0xjNT\ny5L+AXsL+0G8deOtWORDPSpWm6Q7OJmJY67vVh9U7dA70VPUGdqljy4a1fAwzZNU\nmI4gpqwWjCl3c/6c/R4QY85YgkdAgoLPIc0LJr58MTx8zT4oaY8IXf4Sa2xO5kAa\nrk4CoDHZw97N6LP8v4fEMZiqQZ8Mqa0UbX8ORlyF3aKGh0QaAAn9j7aJpEwgcjWh\naBnGI2b7JTofqJIsSbvvFOnNHt1hnkncm7fVXRvcgguHeJ1pVGiSs5h6aMvJ7IiW\nmnXBrBzgho4zAoIBAQDC0gC70MaYUrbpgxHia6RJx7Z/R9rOD5oAd6zF01X46pPs\n8Xym9F9BimCxevCi8WkSFJfFqjjiPA8prvbYVek8na5wgh/iu7Dv6Zbl8Vz+BArf\nMFYRivQuplXZ6pZBPPuhe6wjhvTqafia0TU5niqfyKCMe4suJ6rurHyKgsciURFl\nEQHZ2dtoXZlQJ0ImQOfKpY5I7DS7QtbC61gxqTPnRaIUTe9w5RC3yZ4Ok74EIatg\noBSo0kEqsqE5KIYt+X8VgPS+8iBJVUandaUao73y2paOa0GSlOzKNhrIwL52VjEy\nuzrod5UdLZYD4G2BzNUwjINrH0Gqh7u1Qy2cq3pvAoIBACbXDhpDkmglljOq9CJa\nib3yDUAIP/Gk3YwMXrdUCC+R+SgSk1QyEtcOe1fFElLYUWwnoOTB2m5aMC3IfrTR\nEI8Hn9F+CYWJLJvOhEy7B7kvJL6V7xxSi7xlm5Kv7f7hD09owYXlsFFMlYmnF2Rq\n8O8vlVami1TvOCq+l1//BdPMsa3CVGa1ikyATPnGHLypM/fMsoEi0HAt1ti/QGyq\nCEvwsgY2YWjV0kmLEcV8Rq4gAnr8qswHzRug02pEnbH9nwKXjfpGV3G7smz0ohUy\nsKRuDSO07cDDHFsZ+KlpYNyAoXTFkmcYC0n5Ev4S/2Xs80cC9yFcYU8vVXrU5uvc\npW8CggEBAKblNJAibR6wAUHNzHOGs3EDZB+w7h+1aFlDyAXJkBVspP5m62AmHEaN\nJa00jDulaNq1Xp3bQI0DnNtoly0ihjskawSgKXsKI+E79eK7kPeYEZ4qN26v6rDg\nKCMF8357GjjP7QpI79GwhDyXUwFns3W5stgHaBprhjBAQKQNuqCjrYHpem4EZlNT\n5fwhCP/G9BcvHw4cT/vt+jG24W5JFGnLNxtsdJIPsqQJQymIqISEdQgGk5/ppgla\nVtFHIUtevjK72l8AAO0VRwrtAriILixPuTKM1nFj/lCG5hbFN+/xm1CXLyVCumkV\nImXgKS5UmJB53s9yiomen/n7cUXvrAk=\n-----END + PRIVATE KEY-----","placement":"waf_debug","name":"new-test-kafka","required_acks":"-1"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:45 GMT + Fastly-Ratelimit-Remaining: + - "933" + Fastly-Ratelimit-Reset: + - "1588939200" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9035-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937385.245571,VS0,VE638 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/kafkas/version.yaml b/fastly/fixtures/kafkas/version.yaml new file mode 100644 index 000000000..ec1d092db --- /dev/null +++ b/fastly/fixtures/kafkas/version.yaml @@ -0,0 +1,51 @@ +--- +version: 1 +interactions: +- request: + body: Service=7i6HN3TK9wS159v2gPAZ8A + form: + Service: + - 7i6HN3TK9wS159v2gPAZ8A + headers: + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version + method: POST + response: + body: '{"service_id":"7i6HN3TK9wS159v2gPAZ8A","number":120}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 11:29:44 GMT + Fastly-Ratelimit-Remaining: + - "935" + Fastly-Ratelimit-Reset: + - "1588939200" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9035-CONTROL-SLWDC, cache-pao17429-PAO + X-Timer: + - S1588937384.024980,VS0,VE256 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/kafka.go b/fastly/kafka.go new file mode 100644 index 000000000..20e74b692 --- /dev/null +++ b/fastly/kafka.go @@ -0,0 +1,255 @@ +package fastly + +import ( + "fmt" + "net/url" + "sort" + "time" +) + +// Kafka represents a kafka response from the Fastly API. +type Kafka struct { + ServiceID string `mapstructure:"service_id"` + Version int `mapstructure:"version"` + + Name string `mapstructure:"name"` + Brokers string `mapstructure:"brokers"` + Topic string `mapstructure:"topic"` + RequiredACKs string `mapstructure:"required_acks"` + UseTLS bool `mapstructure:"use_tls"` + CompressionCodec string `mapstructure:"compression_codec"` + Format string `mapstructure:"format"` + FormatVersion uint `mapstructure:"format_version"` + ResponseCondition string `mapstructure:"response_condition"` + Placement string `mapstructure:"placement"` + TLSCACert string `mapstructure:"tls_ca_cert"` + TLSHostname string `mapstructure:"tls_hostname"` + TLSClientCert string `mapstructure:"tls_client_cert"` + TLSClientKey string `mapstructure:"tls_client_key"` + CreatedAt *time.Time `mapstructure:"created_at"` + UpdatedAt *time.Time `mapstructure:"updated_at"` + DeletedAt *time.Time `mapstructure:"deleted_at"` +} + +// kafkaByName is a sortable list of kafkas. +type kafkasByName []*Kafka + +// Len, Swap, and Less implement the sortable interface. +func (s kafkasByName) Len() int { return len(s) } +func (s kafkasByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s kafkasByName) Less(i, j int) bool { + return s[i].Name < s[j].Name +} + +// ListKafkasInput is used as input to the ListKafkas function. +type ListKafkasInput struct { + // Service is the ID of the service (required). + Service string + + // Version is the specific configuration version (required). + Version int +} + +// ListKafkas returns the list of kafkas for the configuration version. +func (c *Client) ListKafkas(i *ListKafkasInput) ([]*Kafka, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/kafka", i.Service, i.Version) + resp, err := c.Get(path, nil) + if err != nil { + return nil, err + } + + var k []*Kafka + if err := decodeJSON(&k, resp.Body); err != nil { + return nil, err + } + sort.Stable(kafkasByName(k)) + return k, nil +} + +// CreateKafkaInput is used as input to the CreateKafka function. +type CreateKafkaInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + Name *string `form:"name,omitempty"` + Brokers *string `form:"brokers,omitempty"` + Topic *string `form:"topic,omitempty"` + RequiredACKs *string `form:"required_acks,omitempty"` + UseTLS *Compatibool `form:"use_tls,omitempty"` + CompressionCodec *string `form:"compression_codec,omitempty"` + Format *string `form:"format,omitempty"` + FormatVersion *uint `form:"format_version,omitempty"` + ResponseCondition *string `form:"response_condition,omitempty"` + Placement *string `form:"placement,omitempty"` + Token *string `form:"token,omitempty"` + TLSCACert *string `form:"tls_ca_cert,omitempty"` + TLSHostname *string `form:"tls_hostname,omitempty"` + TLSClientCert *string `form:"tls_client_cert,omitempty"` + TLSClientKey *string `form:"tls_client_key,omitempty"` +} + +// CreateKafka creates a new Fastly kafka. +func (c *Client) CreateKafka(i *CreateKafkaInput) (*Kafka, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/kafka", i.Service, i.Version) + resp, err := c.PostForm(path, i, nil) + if err != nil { + return nil, err + } + + var k *Kafka + if err := decodeJSON(&k, resp.Body); err != nil { + return nil, err + } + return k, nil +} + +// GetKafkaInput is used as input to the GetKafka function. +type GetKafkaInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + // Name is the name of the kafka to fetch. + Name string +} + +// GetKafka gets the kafka configuration with the given parameters. +func (c *Client) GetKafka(i *GetKafkaInput) (*Kafka, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + if i.Name == "" { + return nil, ErrMissingName + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/kafka/%s", i.Service, i.Version, url.PathEscape(i.Name)) + resp, err := c.Get(path, nil) + if err != nil { + return nil, err + } + + var k *Kafka + if err := decodeJSON(&k, resp.Body); err != nil { + return nil, err + } + return k, nil +} + +// UpdateKafkaInput is used as input to the UpdateKafka function. +type UpdateKafkaInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + // Name is the name of the kafka to update. + Name string + + NewName *string `form:"name,omitempty"` + Brokers *string `form:"brokers,omitempty"` + Topic *string `form:"topic,omitempty"` + RequiredACKs *string `form:"required_acks,omitempty"` + UseTLS *Compatibool `form:"use_tls,omitempty"` + CompressionCodec *string `form:"compression_codec,omitempty"` + Format *string `form:"format,omitempty"` + FormatVersion *uint `form:"format_version,omitempty"` + ResponseCondition *string `form:"response_condition,omitempty"` + Placement *string `form:"placement,omitempty"` + Token *string `form:"token,omitempty"` + TLSCACert *string `form:"tls_ca_cert,omitempty"` + TLSHostname *string `form:"tls_hostname,omitempty"` + TLSClientCert *string `form:"tls_client_cert,omitempty"` + TLSClientKey *string `form:"tls_client_key,omitempty"` +} + +// UpdateKafka updates a specific kafka. +func (c *Client) UpdateKafka(i *UpdateKafkaInput) (*Kafka, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + if i.Name == "" { + return nil, ErrMissingName + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/kafka/%s", i.Service, i.Version, url.PathEscape(i.Name)) + resp, err := c.PutForm(path, i, nil) + if err != nil { + return nil, err + } + + var k *Kafka + if err := decodeJSON(&k, resp.Body); err != nil { + return nil, err + } + return k, nil +} + +// DeleteKafkaInput is the input parameter to DeleteKafka. +type DeleteKafkaInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + // Name is the name of the kafka to delete (required). + Name string +} + +// DeleteKafka deletes the given kafka version. +func (c *Client) DeleteKafka(i *DeleteKafkaInput) error { + if i.Service == "" { + return ErrMissingService + } + + if i.Version == 0 { + return ErrMissingVersion + } + + if i.Name == "" { + return ErrMissingName + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/kafka/%s", i.Service, i.Version, url.PathEscape(i.Name)) + resp, err := c.Delete(path, nil) + if err != nil { + return err + } + + var r *statusResp + if err := decodeJSON(&r, resp.Body); err != nil { + return err + } + if !r.Ok() { + return ErrStatusNotOk + } + return nil +} diff --git a/fastly/kafka_test.go b/fastly/kafka_test.go new file mode 100644 index 000000000..5fdc1fe4b --- /dev/null +++ b/fastly/kafka_test.go @@ -0,0 +1,319 @@ +package fastly + +import ( + "strings" + "testing" +) + +func TestClient_Kafkas(t *testing.T) { + t.Parallel() + + var err error + var tv *Version + record(t, "kafkas/version", func(c *Client) { + tv = testVersion(t, c) + }) + + caCert := strings.TrimSpace(caCert()) + clientCert := strings.TrimSpace(certificate()) + clientKey := strings.TrimSpace(privateKey()) + + // Create + var k *Kafka + record(t, "kafkas/create", func(c *Client) { + k, err = c.CreateKafka(&CreateKafkaInput{ + Service: testServiceID, + Version: tv.Number, + Name: String("test-kafka"), + Brokers: String("192.168.1.1,192.168.1.2"), + Topic: String("kafka-topic"), + RequiredACKs: String("-1"), + UseTLS: CBool(true), + CompressionCodec: String("lz4"), + Format: String("%h %l %u %t \"%r\" %>s %b"), + FormatVersion: Uint(2), + Placement: String("waf_debug"), + TLSCACert: String(caCert), + TLSHostname: String("example.com"), + TLSClientCert: String(clientCert), + TLSClientKey: String(clientKey), + }) + }) + if err != nil { + t.Fatal(err) + } + + // Ensure deleted + defer func() { + record(t, "kafkas/cleanup", func(c *Client) { + c.DeleteKafka(&DeleteKafkaInput{ + Service: testServiceID, + Version: tv.Number, + Name: "test-kafka", + }) + + c.DeleteKafka(&DeleteKafkaInput{ + Service: testServiceID, + Version: tv.Number, + Name: "new-test-kafka", + }) + }) + }() + + if k.Name != "test-kafka" { + t.Errorf("bad name: %q", k.Name) + } + if k.Brokers != "192.168.1.1,192.168.1.2" { + t.Errorf("bad url: %q", k.Brokers) + } + if k.Topic != "kafka-topic" { + t.Errorf("bad topic: %q", k.Topic) + } + if k.RequiredACKs != "-1" { + t.Errorf("bad required_acks: %q", k.RequiredACKs) + } + if k.UseTLS != true { + t.Errorf("bad use_tls: %t", k.UseTLS) + } + if k.CompressionCodec != "lz4" { + t.Errorf("bad compression_codec: %q", k.CompressionCodec) + } + if k.Format != "%h %l %u %t \"%r\" %>s %b" { + t.Errorf("bad format: %q", k.Format) + } + if k.FormatVersion != 2 { + t.Errorf("bad format_version: %q", k.FormatVersion) + } + if k.Placement != "waf_debug" { + t.Errorf("bad placement: %q", k.Placement) + } + if k.TLSCACert != caCert { + t.Errorf("bad tls_ca_cert: %q", k.TLSCACert) + } + if k.TLSHostname != "example.com" { + t.Errorf("bad tls_hostname: %q", k.TLSHostname) + } + if k.TLSClientCert != clientCert { + t.Errorf("bad tls_client_cert: %q", k.TLSClientCert) + } + if k.TLSClientKey != clientKey { + t.Errorf("bad tls_client_key: %q", k.TLSClientKey) + } + + // List + var ks []*Kafka + record(t, "kafkas/list", func(c *Client) { + ks, err = c.ListKafkas(&ListKafkasInput{ + Service: testServiceID, + Version: tv.Number, + }) + }) + if err != nil { + t.Fatal(err) + } + if len(ks) < 1 { + t.Errorf("bad kafkas: %v", ks) + } + + // Get + var nk *Kafka + record(t, "kafkas/get", func(c *Client) { + nk, err = c.GetKafka(&GetKafkaInput{ + Service: testServiceID, + Version: tv.Number, + Name: "test-kafka", + }) + }) + if err != nil { + t.Fatal(err) + } + if k.Name != nk.Name { + t.Errorf("bad name: %q", k.Name) + } + if k.Brokers != nk.Brokers { + t.Errorf("bad url: %q", k.Brokers) + } + if k.Topic != nk.Topic { + t.Errorf("bad topic: %q", k.Topic) + } + if k.RequiredACKs != nk.RequiredACKs { + t.Errorf("bad required_acks: %q", k.RequiredACKs) + } + if k.UseTLS != nk.UseTLS { + t.Errorf("bad use_tls: %t", k.UseTLS) + } + if k.CompressionCodec != nk.CompressionCodec { + t.Errorf("bad compression_codec: %q", k.CompressionCodec) + } + if k.Format != nk.Format { + t.Errorf("bad format: %q", k.Format) + } + if k.FormatVersion != nk.FormatVersion { + t.Errorf("bad format_version: %q", k.FormatVersion) + } + if k.Placement != nk.Placement { + t.Errorf("bad placement: %q", k.Placement) + } + if k.TLSCACert != nk.TLSCACert { + t.Errorf("bad tls_ca_cert: %q", k.TLSCACert) + } + if k.TLSHostname != nk.TLSHostname { + t.Errorf("bad tls_hostname: %q", k.TLSHostname) + } + if k.TLSClientCert != nk.TLSClientCert { + t.Errorf("bad tls_client_cert: %q", k.TLSClientCert) + } + if k.TLSClientKey != nk.TLSClientKey { + t.Errorf("bad tls_client_key: %q", k.TLSClientKey) + } + + // Update + var uk *Kafka + record(t, "kafkas/update", func(c *Client) { + uk, err = c.UpdateKafka(&UpdateKafkaInput{ + Service: testServiceID, + Version: tv.Number, + Name: "test-kafka", + NewName: String("new-test-kafka"), + Topic: String("new-kafka-topic"), + }) + }) + if err != nil { + t.Fatal(err) + } + if uk.Name != "new-test-kafka" { + t.Errorf("bad name: %q", uk.Name) + } + if uk.Topic != "new-kafka-topic" { + t.Errorf("bad topic: %q", uk.Topic) + } + + // Delete + record(t, "kafkas/delete", func(c *Client) { + err = c.DeleteKafka(&DeleteKafkaInput{ + Service: testServiceID, + Version: tv.Number, + Name: "new-test-kafka", + }) + }) + if err != nil { + t.Fatal(err) + } +} + +func TestClient_ListKafkas_validation(t *testing.T) { + var err error + _, err = testClient.ListKafkas(&ListKafkasInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.ListKafkas(&ListKafkasInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_CreateKafka_validation(t *testing.T) { + var err error + _, err = testClient.CreateKafka(&CreateKafkaInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.CreateKafka(&CreateKafkaInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_GetKafka_validation(t *testing.T) { + var err error + _, err = testClient.GetKafka(&GetKafkaInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.GetKafka(&GetKafkaInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.GetKafka(&GetKafkaInput{ + Service: "foo", + Version: 1, + Name: "", + }) + if err != ErrMissingName { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_UpdateKafka_validation(t *testing.T) { + var err error + _, err = testClient.UpdateKafka(&UpdateKafkaInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.UpdateKafka(&UpdateKafkaInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.UpdateKafka(&UpdateKafkaInput{ + Service: "foo", + Version: 1, + Name: "", + }) + if err != ErrMissingName { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_DeleteKafka_validation(t *testing.T) { + var err error + err = testClient.DeleteKafka(&DeleteKafkaInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + err = testClient.DeleteKafka(&DeleteKafkaInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } + + err = testClient.DeleteKafka(&DeleteKafkaInput{ + Service: "foo", + Version: 1, + Name: "", + }) + if err != ErrMissingName { + t.Errorf("bad error: %s", err) + } +}