logs since tests

Signed-off-by: Tomas Tulka <tomas.tulka@gmail.com>
pull/1695/head
Tomas Tulka 4 years ago
parent f3dd2122be
commit 2db8753fc7

@ -36,7 +36,6 @@ import (
"k8s.io/kubectl/pkg/util"
"github.com/fluxcd/flux2/internal/flags"
"github.com/fluxcd/flux2/internal/utils"
)
var logsCmd = &cobra.Command{
@ -96,13 +95,7 @@ func logsCmdRun(cmd *cobra.Command, args []string) error {
ctx, cancel := context.WithTimeout(context.Background(), rootArgs.timeout)
defer cancel()
var pods []corev1.Pod
cfg, err := utils.KubeConfig(rootArgs.kubeconfig, rootArgs.kubecontext)
if err != nil {
return err
}
clientset, err := kubernetes.NewForConfig(cfg)
clientset, err := rootCtx.kubeManager.NewClientset(rootArgs.kubeconfig, rootArgs.kubecontext)
if err != nil {
return err
}
@ -111,6 +104,7 @@ func logsCmdRun(cmd *cobra.Command, args []string) error {
return fmt.Errorf("no argument required")
}
var pods []corev1.Pod
pods, err = getPods(ctx, clientset, fluxSelector)
if err != nil {
return err
@ -131,7 +125,7 @@ func logsCmdRun(cmd *cobra.Command, args []string) error {
if len(logsArgs.sinceTime) > 0 {
t, err := util.ParseRFC3339(logsArgs.sinceTime, metav1.Now)
if err != nil {
return err
return fmt.Errorf("%s is not a valid (RFC3339) time", logsArgs.sinceTime)
}
logOpts.SinceTime = &t
}
@ -155,7 +149,7 @@ func logsCmdRun(cmd *cobra.Command, args []string) error {
return podLogs(ctx, requests)
}
func getPods(ctx context.Context, c *kubernetes.Clientset, label string) ([]corev1.Pod, error) {
func getPods(ctx context.Context, c kubernetes.Interface, label string) ([]corev1.Pod, error) {
var ret []corev1.Pod
opts := metav1.ListOptions{

@ -0,0 +1,64 @@
package main
import (
"testing"
)
func TestLogsNoArgs(t *testing.T) {
cmd := cmdTestCase{
args: "logs",
wantError: false,
}
cmd.runTestCmd(t)
}
func TestLogsAllNamespaces(t *testing.T) {
cmd := cmdTestCase{
args: "logs --all-namespaces",
wantError: false,
}
cmd.runTestCmd(t)
}
func TestLogsSince(t *testing.T) {
cmd := cmdTestCase{
args: "logs --since=2m",
wantError: false,
}
cmd.runTestCmd(t)
}
func TestLogsSinceInvalid(t *testing.T) {
cmd := cmdTestCase{
args: "logs --since=XXX",
wantError: true,
goldenValue: `invalid argument "XXX" for "--since" flag: time: invalid duration "XXX"`,
}
cmd.runTestCmd(t)
}
func TestLogsSinceTime(t *testing.T) {
cmd := cmdTestCase{
args: "logs --since-time=2021-08-06T14:26:25.546Z",
wantError: false,
}
cmd.runTestCmd(t)
}
func TestLogsSinceTimeInvalid(t *testing.T) {
cmd := cmdTestCase{
args: "logs --since-time=XXX",
wantError: true,
goldenValue: "XXX is not a valid (RFC3339) time",
}
cmd.runTestCmd(t)
}
func TestLogsSinceOnlyOneAllowed(t *testing.T) {
cmd := cmdTestCase{
args: "logs --since=2m --since-time=2021-08-06T14:26:25.546Z",
wantError: true,
goldenValue: "at most one of `sinceTime` or `sinceSeconds` may be specified",
}
cmd.runTestCmd(t)
}

@ -13,6 +13,8 @@ import (
"github.com/mattn/go-shellwords"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
k8syaml "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/client-go/kubernetes"
fakeclientset "k8s.io/client-go/kubernetes/fake"
"sigs.k8s.io/controller-runtime/pkg/client"
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
)
@ -51,12 +53,17 @@ func readYamlObjects(objectFile string) ([]client.Object, error) {
// A KubeManager that can create objects that are subject to a test.
type fakeKubeManager struct {
fakeClient client.WithWatch
fakeClientset kubernetes.Interface
}
func (m *fakeKubeManager) NewClient(kubeconfig string, kubecontext string) (client.WithWatch, error) {
return m.fakeClient, nil
}
func (m *fakeKubeManager) NewClientset(kubeconfig string, kubecontext string) (kubernetes.Interface, error) {
return m.fakeClientset, nil
}
func (m *fakeKubeManager) CreateObjects(clientObjects []client.Object) error {
for _, obj := range clientObjects {
err := m.fakeClient.Create(context.Background(), obj)
@ -69,8 +76,10 @@ func (m *fakeKubeManager) CreateObjects(clientObjects []client.Object) error {
func NewFakeKubeManager() *fakeKubeManager {
c := fakeclient.NewClientBuilder().WithScheme(utils.NewScheme()).Build()
cs := fakeclientset.NewSimpleClientset()
return &fakeKubeManager{
fakeClient: c,
fakeClientset: cs,
}
}

@ -37,6 +37,7 @@ import (
apiruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
sigyaml "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"sigs.k8s.io/controller-runtime/pkg/client"
@ -135,6 +136,7 @@ func KubeConfig(kubeConfigPath string, kubeContext string) (*rest.Config, error)
// facilitate unit testing and provide a fake client.
type KubeManager interface {
NewClient(string, string) (client.WithWatch, error)
NewClientset(string, string) (kubernetes.Interface, error)
}
type defaultKubeManager struct{}
@ -161,6 +163,20 @@ func (m defaultKubeManager) NewClient(kubeConfigPath string, kubeContext string)
return kubeClient, nil
}
func (m defaultKubeManager) NewClientset(kubeConfigPath string, kubeContext string) (kubernetes.Interface, error) {
cfg, err := KubeConfig(kubeConfigPath, kubeContext)
if err != nil {
return nil, fmt.Errorf("kubernetes clientset initialization failed: %w", err)
}
clientset, err := kubernetes.NewForConfig(cfg)
if err != nil {
return nil, fmt.Errorf("kubernetes clientset initialization failed: %w", err)
}
return clientset, nil
}
// Create the Scheme, methods for serializing and deserializing API objects
// which can be shared by tests.
func NewScheme() *apiruntime.Scheme {

Loading…
Cancel
Save