github.com/aiven/aiven-go-client@v1.36.0/kafka_schemas.go (about) 1 package aiven 2 3 import ( 4 "errors" 5 "strconv" 6 ) 7 8 type ( 9 // KafkaSubjectSchemasHandler is the client which interacts with the Kafka Schema endpoints on Aiven 10 KafkaSubjectSchemasHandler struct { 11 client *Client 12 } 13 14 // KafkaGlobalSchemaConfigHandler is the client which interacts with the Kafka Schema endpoints on Aiven 15 KafkaGlobalSchemaConfigHandler struct { 16 client *Client 17 } 18 19 // KafkaSchemaConfig represents Aiven Kafka Schema Configuration options 20 KafkaSchemaConfig struct { 21 CompatibilityLevel string `json:"compatibility"` 22 } 23 24 // KafkaSchemaConfigUpdateResponse represents the PUT method response from Aiven Kafka Schema Configuration endpoint 25 KafkaSchemaConfigUpdateResponse struct { 26 APIResponse 27 KafkaSchemaConfig 28 } 29 30 // KafkaSchemaConfigResponse represents the response from Aiven Kafka Schema Configuration endpoint 31 KafkaSchemaConfigResponse struct { 32 APIResponse 33 CompatibilityLevel string `json:"compatibilityLevel"` 34 } 35 36 // KafkaSchemaSubjects represents a list of Aiven Kafka Schema subjects 37 KafkaSchemaSubjects struct { 38 Subjects []string `json:"subjects"` 39 } 40 41 // KafkaSchemaSubjectsResponse represents the response from Aiven Kafka Schema Subjects endpoint 42 KafkaSchemaSubjectsResponse struct { 43 APIResponse 44 KafkaSchemaSubjects 45 } 46 47 // KafkaSchemaSubjectVersions represents a list of versions 48 KafkaSchemaSubjectVersions struct { 49 Versions []int `json:"versions"` 50 } 51 52 // KafkaSchemaSubjectVersionsResponse represents the response from Aiven Kafka Schema Subject versions endpoint 53 KafkaSchemaSubjectVersionsResponse struct { 54 APIResponse 55 KafkaSchemaSubjectVersions 56 } 57 58 // KafkaSchemaSubject Kafka SchemaS Subject representation 59 KafkaSchemaSubject struct { 60 Schema string `json:"schema"` 61 SchemaType string `json:"schemaType,omitempty"` 62 } 63 64 // KafkaSchemaSubjectResponse Kafka Schemas Subject API endpoint response representation 65 KafkaSchemaSubjectResponse struct { 66 APIResponse 67 Id int `json:"id"` 68 } 69 70 // KafkaSchemaSubjectVersion Kafka Schema Subject Version representation 71 KafkaSchemaSubjectVersion struct { 72 Id int `json:"id"` 73 Schema string `json:"schema"` 74 Subject string `json:"subject"` 75 Version int `json:"version"` 76 SchemaType string `json:"schemaType"` 77 } 78 79 // KafkaSchemaSubjectVersionResponse Kafka Schemas Subject Version API endpoint response representation 80 KafkaSchemaSubjectVersionResponse struct { 81 APIResponse 82 Version KafkaSchemaSubjectVersion `json:"version"` 83 } 84 85 // KafkaSchemaValidateResponse Kafka Schemas Subject validation API endpoint response representation 86 KafkaSchemaValidateResponse struct { 87 APIResponse 88 IsCompatible bool `json:"is_compatible"` 89 } 90 ) 91 92 // Update updates new Kafka Schema config entry 93 func (h *KafkaGlobalSchemaConfigHandler) Update(project, service string, c KafkaSchemaConfig) (*KafkaSchemaConfigUpdateResponse, error) { 94 path := buildPath("project", project, "service", service, "kafka", "schema", "config") 95 bts, err := h.client.doPutRequest(path, c) 96 if err != nil { 97 return nil, err 98 } 99 100 var r KafkaSchemaConfigUpdateResponse 101 errR := checkAPIResponse(bts, &r) 102 103 return &r, errR 104 } 105 106 // Get gets a Kafka Schema configuration 107 func (h *KafkaGlobalSchemaConfigHandler) Get(project, service string) (*KafkaSchemaConfigResponse, error) { 108 path := buildPath("project", project, "service", service, "kafka", "schema", "config") 109 bts, err := h.client.doGetRequest(path, nil) 110 if err != nil { 111 return nil, err 112 } 113 114 var r KafkaSchemaConfigResponse 115 errR := checkAPIResponse(bts, &r) 116 117 return &r, errR 118 } 119 120 // List gets a list of Kafka Schema Subjects configuration 121 func (h *KafkaSubjectSchemasHandler) List(project, service string) (*KafkaSchemaSubjectsResponse, error) { 122 path := buildPath("project", project, "service", service, "kafka", "schema", "subjects") 123 bts, err := h.client.doGetRequest(path, nil) 124 if err != nil { 125 return nil, err 126 } 127 128 var r KafkaSchemaSubjectsResponse 129 errR := checkAPIResponse(bts, &r) 130 131 return &r, errR 132 } 133 134 // GetVersions gets a Kafka Schema Subject versions 135 func (h *KafkaSubjectSchemasHandler) GetVersions(project, service, name string) (*KafkaSchemaSubjectVersionsResponse, error) { 136 path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions") 137 bts, err := h.client.doGetRequest(path, nil) 138 if err != nil { 139 return nil, err 140 } 141 142 var r KafkaSchemaSubjectVersionsResponse 143 errR := checkAPIResponse(bts, &r) 144 145 return &r, errR 146 } 147 148 // Delete delete a Kafka Schema Subject versions, of versions parameter is empty it delete all existing versions 149 func (h *KafkaSubjectSchemasHandler) Delete(project, service, name string, versions ...int) error { 150 if len(versions) == 0 { 151 path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name) 152 bts, err := h.client.doDeleteRequest(path, nil) 153 if err != nil { 154 return err 155 } 156 157 if errR := checkAPIResponse(bts, nil); errR != nil { 158 return errR 159 } 160 } 161 162 for _, version := range versions { 163 path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions", strconv.Itoa(version)) 164 bts, err := h.client.doDeleteRequest(path, nil) 165 if err != nil { 166 return err 167 } 168 169 if errR := checkAPIResponse(bts, nil); errR != nil { 170 return errR 171 } 172 } 173 174 return nil 175 } 176 177 // Get gets a Kafka Schema Subject 178 func (h *KafkaSubjectSchemasHandler) Get(project, service, name string, version int) (*KafkaSchemaSubjectVersionResponse, error) { 179 path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions", strconv.Itoa(version)) 180 bts, err := h.client.doGetRequest(path, nil) 181 if err != nil { 182 return nil, err 183 } 184 185 var r KafkaSchemaSubjectVersionResponse 186 errR := checkAPIResponse(bts, &r) 187 188 return &r, errR 189 } 190 191 // Validate validates Kafka Schema 192 func (h *KafkaSubjectSchemasHandler) Validate( 193 project, service, name string, 194 version int, 195 subject KafkaSchemaSubject) (bool, error) { 196 path := buildPath("project", project, "service", service, "kafka", "schema", "compatibility", "subjects", name, "versions", strconv.Itoa(version)) 197 198 bts, err := h.client.doPostRequest(path, subject) 199 if err != nil { 200 return false, err 201 } 202 203 var r KafkaSchemaValidateResponse 204 errR := checkAPIResponse(bts, &r) 205 206 return r.IsCompatible, errR 207 } 208 209 // Add adds a new kafka Schema 210 func (h *KafkaSubjectSchemasHandler) Add(project, service, name string, subject KafkaSchemaSubject) (*KafkaSchemaSubjectResponse, error) { 211 vR, err := h.GetVersions(project, service, name) 212 if err != nil && !IsNotFound(err) { 213 return nil, err 214 } 215 216 // GetVersions latest version 217 if vR != nil { 218 if len(vR.Versions) != 0 { 219 hVersion := 0 220 for _, v := range vR.Versions { 221 if hVersion < v { 222 hVersion = v 223 } 224 } 225 226 // Validate Kafka schema against the latest existing version 227 isValid, err := h.Validate(project, service, name, hVersion, subject) 228 if err != nil { 229 return nil, err 230 } 231 232 if !isValid { 233 return nil, errors.New("kafka schema is not compatible with version :" + strconv.Itoa(hVersion)) 234 } 235 } 236 } 237 238 path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions") 239 bts, err := h.client.doPostRequest(path, subject) 240 if err != nil { 241 return nil, err 242 } 243 244 var r KafkaSchemaSubjectResponse 245 errR := checkAPIResponse(bts, &r) 246 247 return &r, errR 248 } 249 250 // UpdateConfiguration updates configuration for Schema Registry subject 251 func (h *KafkaSubjectSchemasHandler) UpdateConfiguration(project, service, subjectName, compatibility string) ( 252 *KafkaSchemaConfigUpdateResponse, error) { 253 path := buildPath("project", project, "service", service, "kafka", "schema", "config", subjectName) 254 255 bts, err := h.client.doPutRequest(path, KafkaSchemaConfig{ 256 CompatibilityLevel: compatibility, 257 }) 258 if err != nil { 259 return nil, err 260 } 261 262 var r KafkaSchemaConfigUpdateResponse 263 errR := checkAPIResponse(bts, &r) 264 265 return &r, errR 266 } 267 268 func (h *KafkaSubjectSchemasHandler) GetConfiguration(project, service, subjectName string) ( 269 *KafkaSchemaConfigResponse, error) { 270 path := buildPath("project", project, "service", service, "kafka", "schema", "config", subjectName) 271 272 bts, err := h.client.doGetRequest(path+"?global_default_fallback=false", nil) 273 if err != nil { 274 return nil, err 275 } 276 277 var r KafkaSchemaConfigResponse 278 errR := checkAPIResponse(bts, &r) 279 280 return &r, errR 281 }