in aks-node-controller/app.go [124:166]
func (a *App) ProvisionWait(ctx context.Context, filepaths ProvisionStatusFiles) (string, error) {
if _, err := os.Stat(filepaths.ProvisionCompleteFile); err == nil {
data, err := os.ReadFile(filepaths.ProvisionJSONFile)
if err != nil {
return "", fmt.Errorf("failed to read provision.json: %w", err)
}
return string(data), nil
}
watcher, err := fsnotify.NewWatcher()
if err != nil {
return "", fmt.Errorf("failed to create watcher: %w", err)
}
defer watcher.Close()
// Watch the directory containing the provision complete file
dir := filepath.Dir(filepaths.ProvisionCompleteFile)
err = os.MkdirAll(dir, 0755) // create the directory if it doesn't exist
if err != nil {
return "", fmt.Errorf("failed to create directory %s: %w", dir, err)
}
if err = watcher.Add(dir); err != nil {
return "", fmt.Errorf("failed to watch directory: %w", err)
}
for {
select {
case event := <-watcher.Events:
if event.Op&fsnotify.Create == fsnotify.Create && event.Name == filepaths.ProvisionCompleteFile {
data, err := os.ReadFile(filepaths.ProvisionJSONFile)
if err != nil {
return "", fmt.Errorf("failed to read provision.json: %w", err)
}
return string(data), nil
}
case err := <-watcher.Errors:
return "", fmt.Errorf("error watching file: %w", err)
case <-ctx.Done():
return "", fmt.Errorf("context deadline exceeded waiting for provision complete: %w", ctx.Err())
}
}
}