Skip to content

Commit

Permalink
Fix cassandra driver for v4, adjust CI, upgrade dep
Browse files Browse the repository at this point in the history
Squashed commit of the following:

commit 6f951b4
Author: Rafael Espinoza <rafael@rafaelespinoza.com>
Date:   Sat Jan 22 10:28:16 2022 -0800

    ci: Add separate configs for cassandra v3, v4

    Fixing the driver for v4, shouldn't break compatibility for v3.
    Demonstrate that with automated tests for both cassandra versions.

commit a326bc8
Author: Rafael Espinoza <rafael@rafaelespinoza.com>
Date:   Wed Jan 5 15:25:38 2022 -0800

    Fix cassandra driver for v4

    v4.0.1 is the latest at this time.

commit d589238
Author: Rafael Espinoza <rafael@rafaelespinoza.com>
Date:   Sun Jan 9 16:50:54 2022 -0800

    Upgrade github.com/gocql/gocql
  • Loading branch information
rafaelespinoza committed Jan 22, 2022
1 parent 28476fb commit 20ceb6a
Show file tree
Hide file tree
Showing 12 changed files with 96 additions and 35 deletions.
5 changes: 0 additions & 5 deletions .ci/cassandra/server.Dockerfile

This file was deleted.

5 changes: 5 additions & 0 deletions .ci/cassandra/server_v3.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM cassandra:3.11.11
LABEL driver=cassandra role=server

# Tests run on a single node, only need to expose the CQL listener port.
EXPOSE 9042
5 changes: 5 additions & 0 deletions .ci/cassandra/server_v4.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM cassandra:4.0.1
LABEL driver=cassandra role=server

# Tests run on a single node, only need to expose the CQL listener port.
EXPOSE 9042
4 changes: 2 additions & 2 deletions .ci/cassandra/docker-compose.yml → .ci/cassandra/v3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ services:
DB_DSN: "cassandra://server:9042/godfish_test?timeout_ms=2000&connect_timeout_ms=2000"
tty: true
server:
image: godfish_test/cassandra/server:latest
container_name: godfish_ci_cassandra_server
image: godfish_test/cassandra/server_v3:latest
container_name: godfish_ci_cassandra_server_v3
expose:
- "9042"
volumes:
Expand Down
25 changes: 25 additions & 0 deletions .ci/cassandra/v4.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
version: "3.9"

services:
client:
image: godfish_test/cassandra/client:latest
container_name: godfish_ci_cassandra_client
depends_on:
- server
entrypoint: /client.sh server
environment:
CGO_ENABLED: 0
DB_DSN: "cassandra://server:9042/godfish_test?timeout_ms=2000&connect_timeout_ms=2000"
tty: true
server:
image: godfish_test/cassandra/server_v4:latest
container_name: godfish_ci_cassandra_server_v4
expose:
- "9042"
volumes:
-
type: volume
source: server
target: /var/lib/cassandra
volumes:
server:
17 changes: 14 additions & 3 deletions .github/workflows/cassandra.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
name: cassandra
on: [push, pull_request]
jobs:
all:
v3:
name: cassandra_v3
runs-on: ubuntu-20.04
steps:
- name: Checkout repo
uses: actions/checkout@v1
- name: Build environment and run tests
run: make -f Makefile.docker ci-cassandra-up
run: make -f Makefile.docker ci-cassandra3-up
- name: Teardown
run: make -f Makefile.docker ci-cassandra-down
run: make -f Makefile.docker ci-cassandra3-down
v4:
name: cassandra_v4
runs-on: ubuntu-20.04
steps:
- name: Checkout repo
uses: actions/checkout@v1
- name: Build environment and run tests
run: make -f Makefile.docker ci-cassandra4-up
- name: Teardown
run: make -f Makefile.docker ci-cassandra4-down
26 changes: 18 additions & 8 deletions Makefile.docker
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,20 @@ CI_DIR=./.ci
# Build CI environment, run test suite against a live DB.
# NOTE: The client entrypoints require the other Makefile.
#
ci-cassandra-up: build-cassandra
docker-compose -f $(CI_DIR)/cassandra/docker-compose.yml -- up --exit-code-from client
ci-cassandra3-up: build-cassandra3
docker-compose -f $(CI_DIR)/cassandra/v3.yml -- up --exit-code-from client
ci-cassandra4-up: build-cassandra4
docker-compose -f $(CI_DIR)/cassandra/v4.yml -- up --exit-code-from client
ci-mysql-up: build-mysql
docker-compose -f $(CI_DIR)/mysql/docker-compose.yml -- up --exit-code-from client
ci-postgres-up: build-postgres
docker-compose -f $(CI_DIR)/postgres/docker-compose.yml -- up --exit-code-from client
ci-sqlite3-up: build-sqlite3
docker container run --name=$(BASENAME)_sqlite3 -- $(BASENAME)/sqlite3
ci-cassandra-down:
docker-compose -f $(CI_DIR)/cassandra/docker-compose.yml -- down --rmi all --volumes
ci-cassandra3-down:
docker-compose -f $(CI_DIR)/cassandra/v3.yml -- down --rmi all --volumes
ci-cassandra4-down:
docker-compose -f $(CI_DIR)/cassandra/v4.yml -- down --rmi all --volumes
ci-mysql-down:
docker-compose -f $(CI_DIR)/mysql/docker-compose.yml -- down --rmi all --volumes
ci-postgres-down:
Expand All @@ -29,9 +33,13 @@ build-base: $(eval BUILD_DIR=$(shell mktemp -d -p /tmp $(BASENAME)_XXXXXX))
build-base:
git clone --depth=1 file://$(PWD) $(BUILD_DIR)
docker image build -f $(CI_DIR)/client_base.Dockerfile -t $(BASENAME)/client_base $(BUILD_DIR)
build-cassandra: build-base
build-cassandra3: build-base
docker image build -f $(CI_DIR)/cassandra/client.Dockerfile -t $(BASENAME)/cassandra/client $(BUILD_DIR)
docker image build -f $(CI_DIR)/cassandra/server.Dockerfile -t $(BASENAME)/cassandra/server $(BUILD_DIR)
docker image build -f $(CI_DIR)/cassandra/server_v3.Dockerfile -t $(BASENAME)/cassandra/server_v3 $(BUILD_DIR)
rm -rf $(BUILD_DIR)
build-cassandra4: build-base
docker image build -f $(CI_DIR)/cassandra/client.Dockerfile -t $(BASENAME)/cassandra/client $(BUILD_DIR)
docker image build -f $(CI_DIR)/cassandra/server_v4.Dockerfile -t $(BASENAME)/cassandra/server_v4 $(BUILD_DIR)
rm -rf $(BUILD_DIR)
build-mysql: build-base
docker image build -f $(CI_DIR)/mysql/client.Dockerfile -t $(BASENAME)/mysql/client $(BUILD_DIR)
Expand All @@ -50,7 +58,8 @@ build-sqlite3: build-base
#
rm-cassandra:
docker container rm $(shell docker container ls -aq --filter ancestor=$(BASENAME)/cassandra/client)
docker container rm $(shell docker container ls -aq --filter ancestor=$(BASENAME)/cassandra/server)
docker container rm $(shell docker container ls -aq --filter ancestor=$(BASENAME)/cassandra/server_v3)
docker container rm $(shell docker container ls -aq --filter ancestor=$(BASENAME)/cassandra/server_v4)
rm-mysql:
docker container rm $(shell docker container ls -aq --filter ancestor=$(BASENAME)/mysql/client)
docker container rm $(shell docker container ls -aq --filter ancestor=$(BASENAME)/mysql/server)
Expand All @@ -62,7 +71,8 @@ rm-sqlite3:

rmi-cassandra:
docker image rmi $(shell docker image ls -aq $(BASENAME)/cassandra/client)
docker image rmi $(shell docker image ls -aq $(BASENAME)/cassandra/server)
docker image rmi $(shell docker image ls -aq $(BASENAME)/cassandra/server_v3)
docker image rmi $(shell docker image ls -aq $(BASENAME)/cassandra/server_v4)
rmi-mysql:
docker image rmi $(shell docker image ls -aq $(BASENAME)/mysql/client)
docker image rmi $(shell docker image ls -aq $(BASENAME)/mysql/server)
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,13 +149,15 @@ lives in `Makefile.docker` and the `.ci/` directory.

```sh
# Build environments and run tests
make -f Makefile.docker ci-cassandra-up
make -f Makefile.docker ci-cassandra3-up
make -f Makefile.docker ci-cassandra4-up
make -f Makefile.docker ci-mysql-up
make -f Makefile.docker ci-postgres-up
make -f Makefile.docker ci-sqlite3-up

# Teardown
make -f Makefile.docker ci-cassandra-down
make -f Makefile.docker ci-cassandra3-down
make -f Makefile.docker ci-cassandra4-down
make -f Makefile.docker ci-mysql-down
make -f Makefile.docker ci-postgres-down
make -f Makefile.docker ci-sqlite3-down
Expand Down
5 changes: 3 additions & 2 deletions drivers/cassandra/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# cassandra

This `godfish.Driver` implementation has been tested against:
This `godfish.Driver` implementation has been tested against cassandra versions:

- cassandra version 3.11.11
- 3.11.11
- 4.0.1

## Connecting

Expand Down
23 changes: 15 additions & 8 deletions drivers/cassandra/cassandra.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,20 +77,27 @@ func (d *driver) AppliedVersions() (out godfish.AppliedVersions, err error) {

av := execAllAscending(query)

ierr := av.err
if ierr == nil {
if av.err == nil {
out = av
return
}

// A cleaner approach may be to look for a specific error code. The most
// specific error code from the gocql library I've encountered is 8704 (or
// 0x2200 if using cqlsh). As far as I know, it just means "invalid".
if strings.Contains(ierr.Error(), "unconfigured table") {
err = godfish.ErrSchemaMigrationsDoesNotExist
ierr, ok := av.err.(gocql.RequestError)
if !ok {
err = av.err
return
}
err = ierr

// In cassandra v3, the error message might be "unconfigured table".
// In cassandra v4, the error message might be "table does not exist".
// Either version would return this error code (0x2200). At this time, the
// gocql library does not seem to have a more specific error code.
if ierr.Code() == gocql.ErrCodeInvalid && strings.Contains(ierr.Message(), "table") {
err = godfish.ErrSchemaMigrationsDoesNotExist
} else {
err = av.err
}

return
}

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.16

require (
github.com/go-sql-driver/mysql v1.5.0
github.com/gocql/gocql v0.0.0-20210504150947-558dfae50b5d
github.com/gocql/gocql v0.0.0-20211222173705-d73e6b1002a7
github.com/lib/pq v1.10.0
github.com/mattn/go-sqlite3 v1.14.7
github.com/rafaelespinoza/alf v0.2.0
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dR
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/gocql/gocql v0.0.0-20210504150947-558dfae50b5d h1:QbC6FK7LDUrgkZPYdtaKiXGCIw41fdk39H+vrTgHFMs=
github.com/gocql/gocql v0.0.0-20210504150947-558dfae50b5d/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049 h1:K9KHZbXKpGydfDN0aZrsoHpLJlZsBrGMFWbgLDGnPZk=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gocql/gocql v0.0.0-20211222173705-d73e6b1002a7 h1:jmIMM+nEO+vjz9xaRIg9sZNtNLq5nsSbsxwe1OtRwv4=
github.com/gocql/gocql v0.0.0-20211222173705-d73e6b1002a7/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8=
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
Expand Down

0 comments on commit 20ceb6a

Please sign in to comment.