Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
97aff6d
fix(deps): update kubernetes packages to v0.24.3
renovate[bot] Jul 31, 2022
3098674
simplify implementation
nakamasato Aug 1, 2022
abe2c4a
fix 'Stopping and waiting for non leader election runnables' error
nakamasato Aug 21, 2022
c160edb
fix Unit test 'Status.Phase should be NotReady'
nakamasato Aug 21, 2022
a5153e8
fix lint error: Update is not checked (errcheck)
nakamasato Aug 21, 2022
bb2315b
reduced the probability of failing e2e
nakamasato Aug 23, 2022
00a42b7
change timeout
nakamasato Aug 23, 2022
029af85
add debug tool to controller test
nakamasato Sep 25, 2022
353a73d
upgrade mysql to 5.7
nakamasato Mar 5, 2023
91e4230
comment out startDebugTool
nakamasato Mar 6, 2023
8cc375c
fix startDebugTool
nakamasato Mar 6, 2023
56df9ee
update tests
nakamasato Mar 9, 2023
07ceb2a
update
nakamasato Mar 10, 2023
a6436e8
fix skaffold
nakamasato Mar 11, 2023
13fefd8
fix
nakamasato Mar 11, 2023
d09189b
fix
nakamasato Mar 11, 2023
bf900a3
set timeout to 300
nakamasato Mar 11, 2023
32ff7d3
extend timeout
nakamasato Mar 11, 2023
0200c38
remove finalizers' test
nakamasato Mar 11, 2023
fed4177
remove unnecessary import
nakamasato Mar 11, 2023
b1b4700
remove recreation step
nakamasato Mar 11, 2023
11c2618
not delete mysql deployment just delete service
nakamasato Mar 11, 2023
8a69af3
extend timeout
nakamasato Mar 11, 2023
3e03245
fix
nakamasato Mar 11, 2023
3fef452
error
nakamasato Mar 11, 2023
37b979c
fix consistently timeout
nakamasato Mar 11, 2023
b017ea1
update
nakamasato Mar 12, 2023
13fc0eb
update
nakamasato Mar 12, 2023
45de41e
remove tail
nakamasato Mar 12, 2023
5506ddd
use PingContext for db
nakamasato Mar 12, 2023
c0b1048
set 100 millisecond
nakamasato Mar 12, 2023
765d9f7
set timeout to 1 sec
nakamasato Mar 12, 2023
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
Prev Previous commit
Next Next commit
upgrade mysql to 5.7
  • Loading branch information
nakamasato committed Mar 11, 2023
commit 353a73dd706e1036ea8be0514fe14b783cc31168
36 changes: 36 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,33 @@
kubectl delete -f config/samples/mysql_v1alpha1_mysqluser.yaml
kubectl delete -f config/samples/mysql_v1alpha1_mysql.yaml
```

TODO: get stuck in deletion.

<details>

```
1.6780545572555468e+09 INFO [FetchMySQL] Not found {"controller": "mysql", "controllerGroup": "mysql.nakamasato.com", "controllerKind": "MySQL", "mySQL": {"name":"mysql-sample","namespace":"default"}, "namespace": "default", "name": "mysql-sample", "reconcileID": "0b6db5c6-8b3b-43ce-b903-a4959d55064e", "mysql.Name": "", "mysql.Namespace": ""}
1.678054557255548e+09 INFO [FetchMySQLUser] Found. {"controller": "mysqluser", "controllerGroup": "mysql.nakamasato.com", "controllerKind": "MySQLUser", "mySQLUser": {"name":"nakamasato","namespace":"default"}, "namespace": "default", "name": "nakamasato", "reconcileID": "78d4a7cf-5be0-4d47-82c0-38c7fdcf675b", "name": "nakamasato", "mysqlUser.Namespace": "default"}
1.678054557255587e+09 ERROR [FetchMySQL] Failed {"controller": "mysqluser", "controllerGroup": "mysql.nakamasato.com", "controllerKind": "MySQLUser", "mySQLUser": {"name":"nakamasato","namespace":"default"}, "namespace": "default", "name": "nakamasato", "reconcileID": "78d4a7cf-5be0-4d47-82c0-38c7fdcf675b", "error": "MySQL.mysql.nakamasato.com \"mysql-sample\" not found"}
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Reconcile
/Users/m.naka/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/internal/controller/controller.go:121
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler
/Users/m.naka/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/internal/controller/controller.go:320
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
/Users/m.naka/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/internal/controller/controller.go:273
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Start.func2.2
/Users/m.naka/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/internal/controller/controller.go:234
```

When getting stuck:

```
kubectl patch mysqluser nakamasato -p '{"metadata":{"finalizers": []}}' --type=merge
```

</details>

1. Secret is deleted.
```
kubectl get secret
Expand Down Expand Up @@ -83,6 +110,7 @@

```
make uninstall
docker rm -f $(docker ps | grep mysql | head -1 |awk '{print $1}')
```

## Local kubernetes
Expand Down Expand Up @@ -135,6 +163,14 @@ make uninstall
kubectl delete -f config/samples-on-k8s/mysql_v1alpha1_mysqluser.yaml
kubectl delete -f config/samples-on-k8s/mysql_v1alpha1_mysql.yaml
```

TODO: Get stuck:

```
kubectl exec -it $(kubectl get po | grep mysql | head -1 | awk '{print $1}') -- mysql -uroot -ppassword -e 'delete from mysql.user where User = "nakamasato";'
kubectl patch mysqluser nakamasato -p '{"metadata":{"finalizers": []}}' --type=merge
```

1. Stop the `skaffold dev` by `ctrl-c` -> will clean up the controller, CRDs, and installed resources.
# Test

Expand Down
60 changes: 45 additions & 15 deletions e2e/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@ var _ = Describe("E2e", func() {
// deleteMySQLServiceIfExist(ctx)
deleteMySQLUserIfExist(ctx)
deleteMySQLIfExist(ctx)
deleteUserInMysql(mysqlUserName)
// deleteUserInMysql(mysqlUserName)
})

AfterEach(func() {
// deleteMySQLDeploymentIfExist(ctx)
// deleteMySQLServiceIfExist(ctx)
deleteMySQLUserIfExist(ctx)
deleteMySQLIfExist(ctx)
deleteUserInMysql(mysqlUserName)
// deleteUserInMysql(mysqlUserName)
})

Describe("Creating and deleting MySQL/MySQLUser object", func() {
Expand All @@ -73,10 +73,10 @@ var _ = Describe("E2e", func() {
}, timeout, interval).Should(Succeed())

// expect to have mysql user in mysql
Eventually(func() bool {
Eventually(func() int {
res, _ := checkMySQLHasUser(mysqlUserName)
return res
}, timeout, interval).Should(BeTrue())
}, timeout, interval).Should(Equal(1))
})

It("Successfully delete MySQL user and Secret", func() {
Expand All @@ -95,10 +95,10 @@ var _ = Describe("E2e", func() {
}, timeout, interval).Should(BeTrue())

// expect to delete mysql user in mysql
Eventually(func() bool {
Eventually(func() int {
res, _ := checkMySQLHasUser(mysqlUserName)
return res
}, timeout, interval).Should(BeFalse())
}, timeout, interval).Should(Equal(0))
})
})

Expand Down Expand Up @@ -131,47 +131,77 @@ var _ = Describe("E2e", func() {

// expect to have Secret
Eventually(func() error {
mysqlUser, err := getMySQLUser(mysqlUserName, mysqlNamespace)
if err != nil {
fmt.Println("failed to get mysqluer")
return err
}
fmt.Printf("mysqluser: %v, %s\n", mysqlUser.Status, mysqlUser.ObjectMeta.ResourceVersion)
return k8sClient.Get(ctx, client.ObjectKey{Namespace: mysqlNamespace, Name: secretName}, secret)
}, timeout, interval).Should(Succeed())

// expect to have mysql user in mysql
Eventually(func() bool {
Eventually(func() int {
res, _ := checkMySQLHasUser(mysqlUserName)
return res
}, timeout, interval).Should(BeTrue())
}, timeout, interval).Should(Equal(1))
})
})
})
})

func checkMySQLHasUser(mysqluser string) (bool, error) {
func checkMySQLHasUser(mysqluser string) (int, error) {
db, err := sql.Open("mysql", "root:password@tcp(localhost:30306)/") // TODO: Make MySQL root user credentials configurable
if err != nil {
return false, err
return 0, err
}
defer db.Close()
row := db.QueryRow("SELECT COUNT(*) FROM mysql.user where User = '" + mysqluser + "'")
var count int
if err := row.Scan(&count); err != nil {
return false, err
return 0, err
} else {
fmt.Printf("mysql.user count: %s, %d\n", mysqluser, count)
return count > 0, nil
return count, nil
}
}

func deleteUserInMysql(mysqluser string) {
_, err := getDeployment("mysql", mysqlNamespace)
if err != nil {
return
}
db, err := sql.Open("mysql", "root:password@tcp(localhost:30306)/") // TODO: Make MySQL root user credentials configurable
if err != nil {
return
}
defer db.Close()
_, err = db.Exec("DELETE FROM mysql.user where User = '" + mysqluser + "'")
// _, err = db.Exec("DELETE FROM mysql.user where User = '" + mysqluser + "'")

// if err != nil {
// fmt.Printf("failed delete mysql.user %v\n", err)
// } else {
// fmt.Printf("successfully deleted mysql.user: %s\n", mysqluser)
// }
stmtDelete, err := db.Prepare("DELETE FROM mysql.user where User =?")
if err != nil {
panic(err.Error())
}
defer stmtDelete.Close()

result, err := stmtDelete.Exec(mysqluser)
if err != nil {
fmt.Printf("failed delete mysql.user %v\n", err)
panic(err.Error())
}

rowsAffect, err := result.RowsAffected()
if err != nil {
panic(err.Error())
}
if rowsAffect == 0 {
fmt.Printf("[deleteUserInMysql] deleted mysql.user '%s'\n", mysqluser)
} else {
fmt.Printf("successfully deleted mysql.user: %s\n", mysqluser)
fmt.Printf("[deleteUserInMysql] mysql.user '%s' doesn't exist\n", mysqluser)
}
}

Expand Down
67 changes: 66 additions & 1 deletion e2e/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,17 @@ import (

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/util/workqueue"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/source"

mysqlv1alpha1 "github.com/nakamasato/mysql-operator/api/v1alpha1"
appsv1 "k8s.io/api/apps/v1"
Expand All @@ -28,6 +36,7 @@ const (
var skaffold *Skaffold
var kind *Kind
var k8sClient client.Client
var cancel context.CancelFunc

func TestE2e(t *testing.T) {
RegisterFailHandler(Fail) // Use Gomega with Ginkgo
Expand All @@ -40,6 +49,7 @@ var _ = BeforeSuite(func() {
// 2. TODO: Check if kind is avaialble -> install kind if not available.

ctx := context.Background()
ctx, cancel = context.WithCancel(ctx)
kind = newKind(
ctx,
kindName,
Expand All @@ -50,7 +60,19 @@ var _ = BeforeSuite(func() {
prepareKind(kind)

// 4. set k8sclient
setUpK8sClient()
mydir, err := os.Getwd()
if err != nil {
fmt.Println(err)
}
os.Setenv("KUBECONFIG", path.Join(mydir, kubeconfigPath))
cfg, err := config.GetConfigWithContext("kind-" + kindName)
Expect(err).NotTo(HaveOccurred())
Expect(cfg).NotTo(BeNil())
err = mysqlv1alpha1.AddToScheme(scheme.Scheme)
Expect(err).NotTo(HaveOccurred())
k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
Expect(err).NotTo(HaveOccurred())
Expect(k8sClient).NotTo(BeNil())
deleteMySQLUserIfExist(ctx)
deleteMySQLIfExist(ctx)

Expand All @@ -65,11 +87,14 @@ var _ = BeforeSuite(func() {
// 8. Check if mysql-operator is running.
checkMySQLOperator() // check if mysql-operator is running

// 9. Start debug tool
startDebugTool(ctx, cfg, scheme.Scheme)
fmt.Println("Setup completed")
}, 60)

var _ = AfterSuite(func() {
fmt.Println("Clean up mysql-operator and kind cluster")
cancel()
// 1. Remove the deployed resources
skaffold.delete()

Expand Down Expand Up @@ -135,3 +160,43 @@ func checkMySQLOperator() {
log.Fatal(fmt.Printf("%s doesn't have the required replicss", mysqlOperatorDeploymentName))
}
}

func startDebugTool(ctx context.Context, cfg *rest.Config, scheme *runtime.Scheme) {
fmt.Println("startDebugTool")
mapper, err := apiutil.NewDynamicRESTMapper(cfg)
if err != nil {
log.Fatal("failed to create mapper")
}

cache, err := cache.New(cfg, cache.Options{Scheme: scheme, Mapper: mapper})
if err != nil {
log.Fatal("failed to create cache")
}
mysqluser := &mysqlv1alpha1.MySQLUser{}
cache.Get(ctx, client.ObjectKeyFromObject(mysqluser), mysqluser)
kindWithCacheMysqlUser := source.NewKindWithCache(mysqluser, cache)
queue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "test")
eventHandler := handler.Funcs{
CreateFunc: func(e event.CreateEvent, q workqueue.RateLimitingInterface) {
fmt.Printf("CreateFunc is called %s", e.Object.GetName())
},
UpdateFunc: func(e event.UpdateEvent, q workqueue.RateLimitingInterface) {
fmt.Printf("UpdateFunc is called %s", e.ObjectNew.GetName())
},
DeleteFunc: func(e event.DeleteEvent, q workqueue.RateLimitingInterface) {
fmt.Printf("DeleteFunc is called %s", e.Object.GetName())
},
}
fmt.Println("cache starting")
if err := kindWithCacheMysqlUser.Start(ctx, eventHandler, queue); err != nil {
log.Fatal("failed to start kind")
}
fmt.Println("waiting for cache to be synced")
if err := kindWithCacheMysqlUser.WaitForSync(ctx); err != nil {
log.Fatal("failed to wait cache")
}
fmt.Println("cache is synced")
go func() {
<-ctx.Done()
}()
}